diff --git a/100_core/src/gplx/Err.java b/100_core/src/gplx/Err.java index d995216f6..facdd557f 100644 --- a/100_core/src/gplx/Err.java +++ b/100_core/src/gplx/Err.java @@ -44,19 +44,27 @@ public class Err extends RuntimeException { msgs_ary[msgs_idx] = new Err_msg(type, msg, args); ++msgs_idx; } - public String To_str__full() {return To_str(Bool_.N);} - public String To_str__log() {return To_str(Bool_.Y);} - private String To_str(boolean called_by_log) { + public String To_str__full() {return To_str(Bool_.N, Bool_.Y);} + public String To_str__log() {return To_str(Bool_.Y, Bool_.Y);} + public String To_str__msg_only(){ + return msgs_idx == 0 ? "<>" : msgs_ary[0].To_str(); // take 1st message only + } + public String To_str__top_wo_args() { + return msgs_idx == 0 ? "<>" : msgs_ary[0].To_str_wo_args(); + } + private String To_str(boolean called_by_log, boolean include_trace) { String nl_str = called_by_log ? "\t" : "\n"; String rv = ""; //nl_str + "----------------------------------------------------------------------" + nl_str; for (int i = 0; i < msgs_idx; ++i) { rv += "[err " + Int_.Xto_str(i) + "] " + msgs_ary[i].To_str() + nl_str; } - rv += "[trace]:" + Trace_to_str(is_gplx, called_by_log, trace_ignore, trace == null ? Err_.Trace_lang(this) : trace); + if (include_trace) + rv += "[trace]:" + Trace_to_str(is_gplx, called_by_log, trace_ignore, trace == null ? Err_.Trace_lang(this) : trace); return rv; } - @Override public String getMessage() {return To_str__full();} + @Override public String getMessage() {return To_str__msg_only();} public static String Trace_to_str(boolean is_gplx, boolean called_by_log, int ignore_lines, String trace) { + if (trace == null) return ""; // WORKAROUND:.NET: StackTrace is only available when error is thrown; can't do "Console.Write(new Exception().StackTrace); String[] lines = String_.Split_lang(trace, '\n'); int lines_len = lines.length; int line_bgn = 0; if (is_gplx) { // remove Err_.new_wo_type lines from trace for gplx exceptions diff --git a/100_core/src/gplx/Err_.java b/100_core/src/gplx/Err_.java index ffc034a5d..f62d4f43c 100644 --- a/100_core/src/gplx/Err_.java +++ b/100_core/src/gplx/Err_.java @@ -66,6 +66,6 @@ public class Err_ { } public static String Message_gplx_full(Exception e) {return cast_or_make(e).To_str__full();} public static String Message_gplx_log(Exception e) {return cast_or_make(e).To_str__log();} - private static Err cast_or_make(Exception e) {return ClassAdp_.Eq_typeSafe(e, Err.class) ? (Err)e : new Err(Bool_.N, Err_.Trace_lang(e), ClassAdp_.NameOf_obj(e), Err_.Message_lang(e));} + public static Err cast_or_make(Exception e) {return ClassAdp_.Eq_typeSafe(e, Err.class) ? (Err)e : new Err(Bool_.N, Err_.Trace_lang(e), ClassAdp_.NameOf_obj(e), Err_.Message_lang(e));} public static final String Type__op_canceled = "gplx.op_canceled"; } diff --git a/100_core/src/gplx/Err_msg.java b/100_core/src/gplx/Err_msg.java index 2769e92b1..a00793491 100644 --- a/100_core/src/gplx/Err_msg.java +++ b/100_core/src/gplx/Err_msg.java @@ -27,7 +27,9 @@ public class Err_msg { public void Args_add(Object[] add) { this.args = (Object[])Array_.Resize_add(args, add); } - public String To_str() {return To_str_w_type(type, msg, args);} + public String To_str() {return To_str_w_type(type, msg, args);} + public String To_str_wo_type() {return To_str(msg, args);} + public String To_str_wo_args() {return To_str(msg);} public static String To_str(String msg, Object... args) {return To_str_w_type(null, msg, args);} public static String To_str_w_type(String type, String msg, Object... args) { String rv = String_.Len_eq_0(type) ? "" : "<" + type + "> "; diff --git a/100_core/src/gplx/core/btries/Btrie_fast_mgr.java b/100_core/src/gplx/core/btries/Btrie_fast_mgr.java index 724674ef1..f3544de3c 100644 --- a/100_core/src/gplx/core/btries/Btrie_fast_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_fast_mgr.java @@ -42,8 +42,8 @@ public class Btrie_fast_mgr { ++cur_pos; } } - public Btrie_fast_mgr Add_bry_bval(byte key, byte val) {return Add(new byte[] {key}, Byte_obj_val.new_(val));} - public Btrie_fast_mgr Add_bry_bval(byte[] key, byte val) {return Add(key, Byte_obj_val.new_(val));} + public Btrie_fast_mgr Add_bry_byte(byte key, byte val) {return Add(new byte[] {key}, Byte_obj_val.new_(val));} + public Btrie_fast_mgr Add_bry_byte(byte[] key, byte val) {return Add(key, Byte_obj_val.new_(val));} public Btrie_fast_mgr Add_str_byte(String key, byte val) {return Add(Bry_.new_u8(key), Byte_obj_val.new_(val));} public Btrie_fast_mgr Add(byte key, Object val) {return Add(new byte[] {key}, val);} public Btrie_fast_mgr Add(String key, Object val) {return Add(Bry_.new_u8(key), val);} diff --git a/100_core/src/gplx/core/btries/Btrie_slim_mgr.java b/100_core/src/gplx/core/btries/Btrie_slim_mgr.java index 747e71818..73c92a47e 100644 --- a/100_core/src/gplx/core/btries/Btrie_slim_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_slim_mgr.java @@ -46,8 +46,8 @@ public class Btrie_slim_mgr implements Btrie_mgr { public Btrie_slim_mgr Add_bry(String key, String val) {return (Btrie_slim_mgr)Add_obj(Bry_.new_u8(key), Bry_.new_u8(val));} public Btrie_slim_mgr Add_bry(String key, byte[] val) {return (Btrie_slim_mgr)Add_obj(Bry_.new_u8(key), val);} public Btrie_slim_mgr Add_bry(byte[] v) {return (Btrie_slim_mgr)Add_obj(v, v);} - public Btrie_slim_mgr Add_bry_bval(byte b, byte val) {return (Btrie_slim_mgr)Add_obj(new byte[] {b}, Byte_obj_val.new_(val));} - public Btrie_slim_mgr Add_bry_bval(byte[] bry, byte val) {return (Btrie_slim_mgr)Add_obj(bry, Byte_obj_val.new_(val));} + public Btrie_slim_mgr Add_bry_byte(byte b, byte val) {return (Btrie_slim_mgr)Add_obj(new byte[] {b}, Byte_obj_val.new_(val));} + public Btrie_slim_mgr Add_bry_byte(byte[] bry, byte val) {return (Btrie_slim_mgr)Add_obj(bry, Byte_obj_val.new_(val));} public Btrie_slim_mgr Add_str_byte__many(byte val, String... ary) { int ary_len = ary.length; Byte_obj_val bval = Byte_obj_val.new_(val); @@ -55,6 +55,13 @@ public class Btrie_slim_mgr implements Btrie_mgr { Add_obj(Bry_.new_u8(ary[i]), bval); return this; } + public Btrie_slim_mgr Add_many_int(int val, String... ary) { + int len = ary.length; + Int_obj_val obj = Int_obj_val.new_(val); + for (int i = 0; i < len; i++) + Add_obj(Bry_.new_u8(ary[i]), obj); + return this; + } public Btrie_slim_mgr Add_stub(String key, byte val) {byte[] bry = Bry_.new_u8(key); return (Btrie_slim_mgr)Add_obj(bry, new Btrie_itm_stub(val, bry));} public Btrie_slim_mgr Add_stubs(byte[][] ary) {return Add_stubs(ary, ary.length);} public Btrie_slim_mgr Add_stubs(byte[][] ary, int ary_len) { @@ -121,8 +128,8 @@ public class Btrie_slim_mgr implements Btrie_mgr { return dirty ? tmp_bfr.Xto_bry_and_clear() : src; } public void Clear() {root.Clear(); count = 0;} - public static Btrie_slim_mgr cs_() {return new Btrie_slim_mgr(true);} - public static Btrie_slim_mgr ci_ascii_() {return new Btrie_slim_mgr(false);} - public static Btrie_slim_mgr ci_utf_8_() {return new Btrie_slim_mgr(false);} + public static Btrie_slim_mgr cs() {return new Btrie_slim_mgr(Bool_.Y);} + public static Btrie_slim_mgr ci_a7() {return new Btrie_slim_mgr(Bool_.N);} + public static Btrie_slim_mgr ci_u8() {return new Btrie_slim_mgr(Bool_.N);} public static Btrie_slim_mgr new_(boolean v) {return new Btrie_slim_mgr(v);} } diff --git a/100_core/src/gplx/core/btries/Btrie_slim_mgr_tst.java b/100_core/src/gplx/core/btries/Btrie_slim_mgr_tst.java index 25261a052..9ef1d08e4 100644 --- a/100_core/src/gplx/core/btries/Btrie_slim_mgr_tst.java +++ b/100_core/src/gplx/core/btries/Btrie_slim_mgr_tst.java @@ -21,7 +21,7 @@ public class Btrie_slim_mgr_tst { @Before public void init() { } private Btrie_slim_mgr trie; private void ini_setup1() { - trie = Btrie_slim_mgr.cs_(); + trie = Btrie_slim_mgr.cs(); run_Add("a" , 1); run_Add("abc" , 123); } @@ -44,7 +44,7 @@ public class Btrie_slim_mgr_tst { tst_MatchAtCurExact("abc", 123); } private void ini_setup2() { - trie = Btrie_slim_mgr.cs_(); + trie = Btrie_slim_mgr.cs(); run_Add("a" , 1); run_Add("b" , 2); } @@ -54,7 +54,7 @@ public class Btrie_slim_mgr_tst { tst_MatchAtCur("b", 2); } private void ini_setup_caseAny() { - trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:test + trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:test run_Add("a" , 1); run_Add("b" , 2); } diff --git a/100_core/src/gplx/core/btries/Btrie_utf8_itm.java b/100_core/src/gplx/core/btries/Btrie_u8_itm.java similarity index 85% rename from 100_core/src/gplx/core/btries/Btrie_utf8_itm.java rename to 100_core/src/gplx/core/btries/Btrie_u8_itm.java index 882bd3bc2..e18442475 100644 --- a/100_core/src/gplx/core/btries/Btrie_utf8_itm.java +++ b/100_core/src/gplx/core/btries/Btrie_u8_itm.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.core.btries; import gplx.*; import gplx.core.*; import gplx.intl.*; -class Btrie_utf8_itm { +class Btrie_u8_itm { private Hash_adp_bry nxts; private byte[] asymmetric_bry; - public Btrie_utf8_itm(byte[] key, Object val) {this.key = key; this.val = val;} + public Btrie_u8_itm(byte[] key, Object val) {this.key = key; this.val = val;} public byte[] Key() {return key;} private byte[] key; public Object Val() {return val;} public void Val_set(Object val) {this.val = val;} private Object val; public boolean Nxts_is_empty() {return nxts == null;} @@ -29,11 +29,11 @@ class Btrie_utf8_itm { nxts.Clear(); nxts = null; } - public Btrie_utf8_itm Nxts_find(byte[] src, int c_bgn, int c_end, boolean called_by_match) { + public Btrie_u8_itm Nxts_find(byte[] src, int c_bgn, int c_end, boolean called_by_match) { if (nxts == null) return null; Object rv_obj = nxts.Get_by_mid(src, c_bgn, c_end); if (rv_obj == null) return null; - Btrie_utf8_itm rv = (Btrie_utf8_itm)rv_obj; + Btrie_u8_itm rv = (Btrie_u8_itm)rv_obj; byte[] asymmetric_bry = rv.asymmetric_bry; if (asymmetric_bry == null) // itm doesn't have asymmetric_bry; note that this is the case for most items return rv; @@ -51,9 +51,9 @@ class Btrie_utf8_itm { } } } - public Btrie_utf8_itm Nxts_add(Gfo_case_mgr case_mgr, byte[] key, Object val) { - Btrie_utf8_itm rv = new Btrie_utf8_itm(key, val); - if (nxts == null) nxts = Hash_adp_bry.ci_utf8_(case_mgr); + public Btrie_u8_itm Nxts_add(Gfo_case_mgr case_mgr, byte[] key, Object val) { + Btrie_u8_itm rv = new Btrie_u8_itm(key, val); + if (nxts == null) nxts = Hash_adp_bry.ci_u8(case_mgr); nxts.Add_bry_obj(key, rv); Gfo_case_itm case_itm = case_mgr.Get_or_null(key[0], key, 0, key.length); // get case_item if (case_itm != null) { // note that case_itm may be null; EX: "__TOC__" and "_" diff --git a/100_core/src/gplx/core/btries/Btrie_utf8_mgr.java b/100_core/src/gplx/core/btries/Btrie_u8_mgr.java similarity index 79% rename from 100_core/src/gplx/core/btries/Btrie_utf8_mgr.java rename to 100_core/src/gplx/core/btries/Btrie_u8_mgr.java index b64a54d43..c3ece4eac 100644 --- a/100_core/src/gplx/core/btries/Btrie_utf8_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_u8_mgr.java @@ -17,22 +17,22 @@ along with this program. If not, see . */ package gplx.core.btries; import gplx.*; import gplx.core.*; import gplx.intl.*; -public class Btrie_utf8_mgr implements Btrie_mgr { - private Btrie_utf8_itm root; private Gfo_case_mgr case_mgr; - Btrie_utf8_mgr(Gfo_case_mgr case_mgr) { +public class Btrie_u8_mgr implements Btrie_mgr { + private Btrie_u8_itm root; private Gfo_case_mgr case_mgr; + Btrie_u8_mgr(Gfo_case_mgr case_mgr) { this.case_mgr = case_mgr; - this.root = new Btrie_utf8_itm(Bry_.Empty, null); + this.root = new Btrie_u8_itm(Bry_.Empty, null); } public int Count() {return count;} private int count; public int Match_pos() {return match_pos;} private int match_pos; public Object Match_bgn(byte[] src, int bgn_pos, int end_pos) {return Match_bgn_w_byte(src[bgn_pos], src, bgn_pos, end_pos);} public Object Match_bgn_w_byte(byte b, byte[] src, int bgn_pos, int end_pos) { Object rv = null; int cur_pos = match_pos = bgn_pos; - Btrie_utf8_itm cur = root; + Btrie_u8_itm cur = root; while (true) { int c_len = Utf8_.Len_of_char_by_1st_byte(b); int c_end = cur_pos + c_len; - Btrie_utf8_itm nxt = cur.Nxts_find(src, cur_pos, c_end, true); if (nxt == null) return rv; // nxts does not have key; return rv; + Btrie_u8_itm nxt = cur.Nxts_find(src, cur_pos, c_end, true); if (nxt == null) return rv; // nxts does not have key; return rv; cur_pos = c_end; if (nxt.Nxts_is_empty()) {match_pos = cur_pos; return nxt.Val();} // nxt is leaf; return nxt.Val() (which should be non-null) Object nxt_val = nxt.Val(); @@ -47,13 +47,13 @@ public class Btrie_utf8_mgr implements Btrie_mgr { public Btrie_mgr Add_obj(byte[] key, Object val) { if (val == null) throw Err_.new_wo_type("null objects cannot be registered", "key", String_.new_u8(key)); int key_len = key.length; - Btrie_utf8_itm cur = root; + Btrie_u8_itm cur = root; int c_bgn = 0; while (c_bgn < key_len) { byte c = key[c_bgn]; int c_len = Utf8_.Len_of_char_by_1st_byte(c); int c_end = c_bgn + c_len; - Btrie_utf8_itm nxt = cur.Nxts_find(key, c_bgn, c_end, false); + Btrie_u8_itm nxt = cur.Nxts_find(key, c_bgn, c_end, false); if (nxt == null) nxt = cur.Nxts_add(case_mgr, Bry_.Mid(key, c_bgn, c_end), null); c_bgn = c_end; @@ -64,5 +64,5 @@ public class Btrie_utf8_mgr implements Btrie_mgr { ++count; return this; } - public static Btrie_utf8_mgr new_(Gfo_case_mgr case_mgr) {return new Btrie_utf8_mgr(case_mgr);} + public static Btrie_u8_mgr new_(Gfo_case_mgr case_mgr) {return new Btrie_u8_mgr(case_mgr);} } diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index afe4c2fc0..1a9197a78 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -177,31 +177,6 @@ public class Bry_ { for (int i = 0; i < src_len; i++) trg[i + trg_bgn] = src[i + src_bgn]; } - public static byte[][] XtoByteAryAry(String... strAry) { - int strAryLen = strAry.length; - byte[][] rv = new byte[strAryLen][]; - for (int i = 0; i < strAryLen; i++) - rv[i] = Bry_.new_u8(strAry[i]); - return rv; - } - public static byte[] Xto_str_lower(byte[] src, int bgn, int end) { - int len = end - bgn; - byte[] rv = new byte[len]; - for (int i = bgn; i < end; i++) { - byte b = src[i]; - switch (b) { - case Byte_ascii.Ltr_A: case Byte_ascii.Ltr_B: case Byte_ascii.Ltr_C: case Byte_ascii.Ltr_D: case Byte_ascii.Ltr_E: - case Byte_ascii.Ltr_F: case Byte_ascii.Ltr_G: case Byte_ascii.Ltr_H: case Byte_ascii.Ltr_I: case Byte_ascii.Ltr_J: - case Byte_ascii.Ltr_K: case Byte_ascii.Ltr_L: case Byte_ascii.Ltr_M: case Byte_ascii.Ltr_N: case Byte_ascii.Ltr_O: - case Byte_ascii.Ltr_P: case Byte_ascii.Ltr_Q: case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_S: case Byte_ascii.Ltr_T: - case Byte_ascii.Ltr_U: case Byte_ascii.Ltr_V: case Byte_ascii.Ltr_W: case Byte_ascii.Ltr_X: case Byte_ascii.Ltr_Y: case Byte_ascii.Ltr_Z: - b += 32; - break; - } - rv[i - bgn] = b; - } - return rv; - } public static byte[] Replace_one(byte[] src, byte[] find, byte[] repl) { int src_len = src.length; int findPos = Bry_finder.Find(src, find, 0, src_len, true); if (findPos == Bry_.NotFound) return src; @@ -325,7 +300,7 @@ public class Bry_ { } public static byte[] Mid_safe(byte[] src, int bgn, int end) { try {return Mid(src, bgn, end);} - catch (Exception e) {Err_.Noop(e); return Bry_.Add_w_dlm(Byte_ascii.Space, Bry_.XbyInt(bgn), Bry_.XbyInt(end));} + catch (Exception e) {Err_.Noop(e); return Bry_.Add_w_dlm(Byte_ascii.Space, Bry_.new_by_int(bgn), Bry_.new_by_int(end));} } public static byte[] Mid(byte[] src, int bgn) {return Mid(src, bgn, src.length);} public static byte[] Mid_or(byte[] src, int bgn, int end, byte[] or) { @@ -562,7 +537,7 @@ 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) { + public static boolean Eq_ci_a7(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; @@ -575,8 +550,22 @@ public class Bry_ { } 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) { + public static int To_int_by_a7(byte[] v) { + int v_len = v.length; + int mod = 8 * (v_len - 1); + int rv = 0; + for (int i = 0; i < v_len; i++) { + rv |= v[i] << mod; + mod -= 8; + } + return rv; +// return ((0xFF & v[0]) << 24) +// | ((0xFF & v[1]) << 16) +// | ((0xFF & v[2]) << 8) +// | (0xFF & v[3]); + } + public static byte[] To_a7_bry(int val, int pad_len) {return To_a7_bry(val, null, 0, pad_len);} + public static byte[] To_a7_bry(int val, byte[] ary, int aryPos, int pad_len) { int neg = 0; if (val < 0) { val *= -1; @@ -584,47 +573,57 @@ public class Bry_ { } int digits = val == 0 ? 0 : Math_.Log10(val); digits += 1; // digits = log + 1; EX: Log(1-9) = 0, Log(10-99) = 1 - int aryLen = digits + neg, aryBgn = aryPos, pad = 0; - if (aryLen < padLen) { // padding specified - pad = padLen - aryLen; - aryLen = padLen; + int ary_len = digits + neg, aryBgn = aryPos, pad = 0; + if (ary_len < pad_len) { // padding specified + pad = pad_len - ary_len; + ary_len = pad_len; } - if (ary == null) ary = new byte[aryLen]; + if (ary == null) ary = new byte[ary_len]; long factor = 1; // factor needs to be long to handle 1 billion (for which factor would be 10 billion) for (int i = 0; i < digits; i++) // calc maxFactor factor *= 10; if (neg == 1) ary[0] = Byte_NegSign; for (int i = 0; i < pad; i++) // fill ary with pad - ary[i + aryBgn] = XtoStrByte(0); + ary[i + aryBgn] = Byte_ascii.To_a7_byte(0); aryBgn += pad; // advance aryBgn by pad - for (int i = neg; i < aryLen - pad; i++) { + for (int i = neg; i < ary_len - pad; i++) { int denominator = (int)(factor / 10); // cache denominator to check for divide by 0 int digit = denominator == 0 ? 0 : (int)((val % factor) / denominator); - ary[aryBgn + i] = XtoStrByte(digit); + ary[aryBgn + i] = Byte_ascii.To_a7_byte(digit); factor /= 10; } return ary; } - 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_wo_type("could not parse to int", "val", String_.new_u8(ary)); - return rv; + public static byte[] new_by_int(int v) { + byte b0 = (byte)(v >> 24); + byte b1 = (byte)(v >> 16); + byte b2 = (byte)(v >> 8); + byte b3 = (byte)(v); + if (b0 != 0) return new byte[] {b0, b1, b2, b3}; + else if (b1 != 0) return new byte[] {b1, b2, b3}; + else if (b2 != 0) return new byte[] {b2, b3}; + else return new byte[] {b3}; } - public static boolean Xto_bool_by_int_or_fail(byte[] ary) { - int rv = Xto_int_or(ary, null, 0, ary.length, Int_.MinValue); + public static boolean To_bool_by_int(byte[] ary) { + int rv = To_int_or(ary, null, 0, ary.length, Int_.MinValue); switch (rv) { case 0: return false; case 1: return true; default: throw Err_.new_wo_type("could not parse to boolean int", "val", String_.new_u8(ary)); } } - 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 or) {return Xto_int_or(ary, ignore_ary, 0, ary.length, or);} - public static int Xto_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) { + public static byte To_int_as_byte(byte[] ary, int bgn, int end, byte or) {return (byte)To_int_or(ary, bgn, end, or);} + public static int To_int(byte[] ary) { + int rv = To_int_or(ary, null, 0, ary.length, Int_.MinValue); + if (rv == Int_.MinValue) throw Err_.new_wo_type("could not parse to int", "val", String_.new_u8(ary)); + return rv; + } + public static int To_int_or_neg1(byte[] ary) {return To_int_or(ary, null, 0, ary.length, -1);} + public static int To_int_or(byte[] ary, int or) {return To_int_or(ary, null, 0, ary.length, or);} + public static int To_int_or(byte[] ary, int bgn, int end, int or) {return To_int_or(ary, null, bgn, end, or);} + public static int To_int_or(byte[] ary, byte[] ignore_ary, int or) {return To_int_or(ary, ignore_ary, 0, ary.length, or);} + public static int To_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) { if ( ary == null || end == bgn // null-len ) return or; @@ -658,7 +657,42 @@ public class Bry_ { } return rv; } - 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 + public static long To_long_or(byte[] ary, long or) {return To_long_or(ary, null, 0, ary.length, or);} + public static long To_long_or(byte[] ary, byte[] ignore_ary, int bgn, int end, long or) { + if ( ary == null + || end == bgn // null-len + ) return or; + long rv = 0, multiple = 1; + for (int i = end - 1; i >= bgn; i--) { // -1 b/c end will always be next char; EX: {{{1}}}; bgn = 3, end = 4 + byte b = ary[i]; + 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: + rv += multiple * (b - Byte_ascii.Num_0); + multiple *= 10; + break; + case Byte_ascii.Dash: + return i == bgn ? rv * -1 : or; + case Byte_ascii.Plus: + return i == bgn ? rv : or; + default: + boolean invalid = true; + if (ignore_ary != null) { + int ignore_ary_len = ignore_ary.length; + for (int j = 0; j < ignore_ary_len; j++) { + if (b == ignore_ary[j]) { + invalid = false; + break; + } + } + } + if (invalid) return or; + break; + } + } + return rv; + } + public static int To_int_or__trim_ws(byte[] ary, int bgn, int end, int or) { // NOTE: same as To_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; @@ -684,7 +718,7 @@ public class Bry_ { } return rv; } - public static int Xto_int_or_lax(byte[] ary, int bgn, int end, int or) { + public static int To_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++) { @@ -705,14 +739,12 @@ public class Bry_ { break; } } - return Xto_int_or(ary, bgn, end_num, or); + return To_int_or(ary, bgn, end_num, or); } - public static float XtoFloatByPos(byte[] ary, int bgn, int end) {return Float_.parse_(String_.new_u8(ary, bgn, end));} - public static double Xto_double(byte[] bry) {return Double_.parse_(String_.new_u8(bry, 0, bry.length));} - public static double Xto_double_or(byte[] bry, double or) {return Double_.parse_or(String_.new_u8(bry, 0, bry.length), or);} - public static double XtoDoubleByPosOr(byte[] ary, int bgn, int end, double or) {return Double_.parse_or(String_.new_u8(ary, bgn, end), or);} - public static double XtoDoubleByPos(byte[] ary, int bgn, int end) {return Double_.parse_(String_.new_u8(ary, bgn, end));} - public static DecimalAdp XtoDecimalByPos(byte[] ary, int bgn, int end) {return DecimalAdp_.parse_(String_.new_u8(ary, bgn, end));} + public static double To_double(byte[] ary, int bgn, int end) {return Double_.parse_(String_.new_u8(ary, bgn, end));} + public static double To_double_or(byte[] bry, double or) {return Double_.parse_or(String_.new_u8(bry, 0, bry.length), or);} + public static double To_double_or(byte[] ary, int bgn, int end, double or) {return Double_.parse_or(String_.new_u8(ary, bgn, end), or);} + public static Decimal_adp To_decimal(byte[] ary, int bgn, int end) {return Decimal_adp_.parse_(String_.new_u8(ary, bgn, end));} public static final byte Dlm_fld = (byte)'|', Dlm_row = (byte)'\n', Dlm_quote = (byte)'"', Dlm_null = 0, Ascii_zero = 48; public static final String Fmt_csvDte = "yyyyMMdd HHmmss.fff"; public static DateAdp ReadCsvDte(byte[] ary, Int_obj_ref posRef, byte lkp) {// ASSUME: fmt = yyyyMMdd HHmmss.fff @@ -783,7 +815,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_wo_type("lkp failed", "lkp", (char)lkp, "bgn", bgn); - int rv = Bry_.Xto_int_or(ary, posRef.Val(), pos, -1); + int rv = Bry_.To_int_or(ary, posRef.Val(), pos, -1); posRef.Val_(pos + 1); // +1 = lkp.Len return rv; } @@ -791,7 +823,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_wo_type("lkp failed", "lkp", (char)lkp, "bgn", bgn); - double rv = Bry_.XtoDoubleByPos(ary, posRef.Val(), pos); + double rv = Bry_.To_double(ary, posRef.Val(), pos); posRef.Val_(pos + 1); // +1 = lkp.Len return rv; } @@ -801,37 +833,6 @@ public class Bry_ { posRef.Val_(pos + 1); // +1 = lkp.Len } public static byte Byte_NegSign = (byte)'-'; - public static int XtoIntBy4Bytes(byte[] v) { - int v_len = v.length; - int mod = 8 * (v_len - 1); - int rv = 0; - for (int i = 0; i < v_len; i++) { - rv |= v[i] << mod; - mod -= 8; - } - return rv; -// return ((0xFF & v[0]) << 24) -// | ((0xFF & v[1]) << 16) -// | ((0xFF & v[2]) << 8) -// | (0xFF & v[3]); - } - public static byte[] XbyInt(int v) { - byte b0 = (byte)(v >> 24); - byte b1 = (byte)(v >> 16); - byte b2 = (byte)(v >> 8); - byte b3 = (byte)(v); - if (b0 != 0) return new byte[] {b0, b1, b2, b3}; - else if (b1 != 0) return new byte[] {b1, b2, b3}; - else if (b2 != 0) return new byte[] {b2, b3}; - else return new byte[] {b3}; - } - public static byte XtoStrByte(int digit) { - switch (digit) { - case 0: return Byte_ascii.Num_0; case 1: return Byte_ascii.Num_1; case 2: return Byte_ascii.Num_2; case 3: return Byte_ascii.Num_3; case 4: return Byte_ascii.Num_4; - case 5: return Byte_ascii.Num_5; case 6: return Byte_ascii.Num_6; case 7: return Byte_ascii.Num_7; case 8: return Byte_ascii.Num_8; case 9: return Byte_ascii.Num_9; - default: throw Err_.new_wo_type("unknown digit", "digit", digit); - } - } public static byte[][] Split(byte[] src, byte dlm) {return Split(src, dlm, false);} public static byte[][] Split(byte[] src, byte dlm, boolean trim) { if (Bry_.Len_eq_0(src)) return Bry_.Ary_empty; @@ -993,41 +994,43 @@ public class Bry_ { } return ary; } - public static byte[] Upper_1st(byte[] ary) { - if (ary == null) return null; - int len = ary.length; - if (len == 0) return ary; - byte b = ary[0]; - if (b > 96 && b < 123) - ary[0] = (byte)(b - 32); - return ary; - } - public static byte[] Upper_ascii(byte[] ary) { - int len = ary.length; - for (int i = 0; i < len; i++) { - byte b = ary[i]; - if (b > 96 && b < 123) - ary[i] = (byte)(b - 32); + public static byte[] Ucase__all(byte[] src) {return Xcase__all(Bool_.Y, src, 0, -1);} + public static byte[] Lcase__all(byte[] src) {return Xcase__all(Bool_.N, src, 0, -1);} + public static byte[] Lcase__all(byte[] src, int bgn, int end) {return Xcase__all(Bool_.N, src, bgn, end);} + private static byte[] Xcase__all(boolean upper, byte[] src, int bgn, int end) { + if (src == null) return null; + int len = end == -1 ? src.length : end - bgn; if (len == 0) return src; + byte[] rv = new byte[len]; + for (int i = 0; i < len; ++i) { + byte b = src[i + bgn]; + if (upper) { + if (b > 96 && b < 123) b -= 32; + } + else { + if (b > 64 && b < 91) b += 32; + } + rv[i] = b; } - return ary; + return rv; } - public static byte[] Lower_1st(byte[] ary) { - if (ary == null) return null; - int len = ary.length; - if (len == 0) return ary; - byte b = ary[0]; - if (b > 64 && b < 91) - ary[0] = (byte)(b + 32); - return ary; - } - public static byte[] Lower_ascii(byte[] ary) { - int len = ary.length; - for (int i = 0; i < len; i++) { - byte b = ary[i]; - if (b > 64 && b < 91) - ary[i] = (byte)(b + 32); + public static byte[] Ucase__1st(byte[] src) {return Xcase__1st(Bool_.Y, src);} + public static byte[] Lcase__1st(byte[] src) {return Xcase__1st(Bool_.N, src);} + private static byte[] Xcase__1st(boolean upper, byte[] src) { + if (src == null) return null; + int len = src.length; if (len == 0) return src; + byte[] rv = new byte[len]; + byte b = src[0]; + if (upper) { + if (b > 96 && b < 123) b -= 32; } - return ary; + else { + if (b > 64 && b < 91) b += 32; + } + rv[0] = b; + for (int i = 1; i < len; ++i) { + rv[i] = src[i]; + } + return rv; } public static byte[] Null_if_empty(byte[] v) {return Len_eq_0(v) ? null : v;} public static byte Get_at_end(byte[] v) { diff --git a/100_core/src_110_primitive/gplx/Bry__tst.java b/100_core/src_110_primitive/gplx/Bry__tst.java index 4ae71f392..9c0220e82 100644 --- a/100_core/src_110_primitive/gplx/Bry__tst.java +++ b/100_core/src_110_primitive/gplx/Bry__tst.java @@ -43,9 +43,9 @@ public class Bry__tst { byte[] expd = new byte[expdAryAsInt.length]; for (int i = 0; i < expd.length; i++) { int expdInt = expdAryAsInt[i]; - expd[i] = expdInt == Bry_.Byte_NegSign ? Bry_.Byte_NegSign : Bry_.XtoStrByte(expdAryAsInt[i]); + expd[i] = expdInt == Bry_.Byte_NegSign ? Bry_.Byte_NegSign : Byte_ascii.To_a7_byte(expdAryAsInt[i]); } - Tfds.Eq_ary(expd, Bry_.XtoStrBytesByInt(val, Int_.DigitCount(val))); + Tfds.Eq_ary(expd, Bry_.To_a7_bry(val, Int_.DigitCount(val))); } @Test public void Has_at_end() { tst_HasAtEnd("a|bcd|e", "d" , 2, 5, true); // y_basic @@ -109,8 +109,8 @@ 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_.Xto_int_or(Bry_.new_u8(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_XtoInt(String val, int or, int expd) {Tfds.Eq(expd, Bry_.To_int_or(Bry_.new_u8(val), or));} + void tst_XtoIntBy4Bytes(int expd, byte... ary) {Tfds.Eq(expd, Bry_.To_int_by_a7(ary), "XtoInt"); Tfds.Eq_ary(ary, Bry_.new_by_int(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);} void tst_ReadCsvStr(String raw, Int_obj_ref bgnRef, String expd) { @@ -148,14 +148,14 @@ public class Bry__tst { tst_Xto_int_lax("a", 0); tst_Xto_int_lax("-1", -1); } - private void tst_Xto_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_lax(Bry_.new_u8(val), 0, String_.Len(val), 0));} - @Test public void Xto_int_or_trim() { + private void tst_Xto_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.To_int_or__lax(Bry_.new_u8(val), 0, String_.Len(val), 0));} + @Test public void To_int_or__trim_ws() { 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_Xto_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_trim(Bry_.new_u8(val), 0, String_.Len(val), -1));} + private void tst_Xto_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.To_int_or__trim_ws(Bry_.new_u8(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/Byte_ascii.java b/100_core/src_110_primitive/gplx/Byte_ascii.java index 4d56c25ae..469c78432 100644 --- a/100_core/src_110_primitive/gplx/Byte_ascii.java +++ b/100_core/src_110_primitive/gplx/Byte_ascii.java @@ -76,6 +76,13 @@ public class Byte_ascii { return b > Byte_ascii.Slash && b < Byte_ascii.Colon; } public static int Xto_digit(byte b) {return b - Byte_ascii.Num_0;} + public static byte To_a7_byte(int digit) { + switch (digit) { + case 0: return Byte_ascii.Num_0; case 1: return Byte_ascii.Num_1; case 2: return Byte_ascii.Num_2; case 3: return Byte_ascii.Num_3; case 4: return Byte_ascii.Num_4; + case 5: return Byte_ascii.Num_5; case 6: return Byte_ascii.Num_6; case 7: return Byte_ascii.Num_7; case 8: return Byte_ascii.Num_8; case 9: return Byte_ascii.Num_9; + default: throw Err_.new_("Byte_ascii", "unknown digit", "digit", digit); + } + } public static byte Case_upper(byte b) { return b > 96 && b < 123 ? (byte)(b - 32) @@ -91,6 +98,8 @@ public class Byte_ascii { Tab_bry = new byte[] {Byte_ascii.Tab} , Nl_bry = new byte[] {Byte_ascii.Nl} , Bang_bry = new byte[] {Byte_ascii.Bang} + , Quote_bry = new byte[] {Byte_ascii.Quote} + , Hash_bry = new byte[] {Byte_ascii.Hash} , Dot_bry = new byte[] {Byte_ascii.Dot} , Comma_bry = new byte[] {Byte_ascii.Comma} , Colon_bry = new byte[] {Byte_ascii.Colon} @@ -100,7 +109,6 @@ public class Byte_ascii { , Brack_bgn_bry = new byte[] {Byte_ascii.Brack_bgn} , Brack_end_bry = new byte[] {Byte_ascii.Brack_end} , Apos_bry = new byte[] {Byte_ascii.Apos} - , Quote_bry = new byte[] {Byte_ascii.Quote} , Pipe_bry = new byte[] {Byte_ascii.Pipe} , Underline_bry = new byte[] {Byte_ascii.Underline} , Slash_bry = new byte[] {Byte_ascii.Slash} diff --git a/100_core/src_110_primitive/gplx/Int_ary_.java b/100_core/src_110_primitive/gplx/Int_ary_.java index 14ae94b63..d0fa50d28 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_.Xto_int_or(src, num_bgn, num_end, Int_.MinValue); + int num = Bry_.To_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_.Xto_int_or(src, num_bgn, pos, Int_.MinValue); + rng_bgn = Bry_.To_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/Object_.java b/100_core/src_110_primitive/gplx/Object_.java index 8f42ba924..d4fa6fbbf 100644 --- a/100_core/src_110_primitive/gplx/Object_.java +++ b/100_core/src_110_primitive/gplx/Object_.java @@ -30,17 +30,17 @@ public class Object_ { public static String Xto_str_strict_or_empty(Object v) {return v == null ? String_.Empty : ToString_lang(v);} private static String ToString_lang(Object v) { Class c = v.getClass(); - if (ClassAdp_.Eq(c, String_.Cls_ref_type)) return (String)v; + if (ClassAdp_.Eq(c, String_.Cls_ref_type)) return (String)v; else if (ClassAdp_.Eq(c, Bry_.Cls_ref_type)) return String_.new_u8((byte[])v); - else return v.toString(); + 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, String_.Cls_ref_type)) return (String)v; - else if (ClassAdp_.Eq(c, Bry_.Cls_ref_type)) return String_.new_u8((byte[])v); + else if (ClassAdp_.Eq(c, Bry_.Cls_ref_type)) return String_.new_u8((byte[])v); else if (ClassAdp_.Eq(c, Bool_.Cls_ref_type)) return Bool_.cast_(v) ? Bool_.True_str : Bool_.False_str; // always return "true" / "false" else if (ClassAdp_.Eq(c, Double_.Cls_ref_type)) return Double_.Xto_str_loose(Double_.cast_(v)); - else return v.toString(); + else return v.toString(); } } \ No newline at end of file diff --git a/100_core/src_110_primitive/gplx/String_.java b/100_core/src_110_primitive/gplx/String_.java index e8843defb..be26c4eec 100644 --- a/100_core/src_110_primitive/gplx/String_.java +++ b/100_core/src_110_primitive/gplx/String_.java @@ -534,4 +534,15 @@ public class String_ implements GfoInvkAble { } return trg_ary; } + public static String To_str__as_kv_ary(String... ary) { + int len = ary.length; + Bry_bfr bfr = Bry_bfr.new_(); + for (int i = 0; i < len; i+=2) { + bfr.Add_str_u8(ary[i]).Add_byte_eq(); + String val = i + 1 < len ? ary[i + 1] : null; + if (val != null) bfr.Add_str_u8(val); + bfr.Add_byte_nl(); + } + return bfr.Xto_str_and_clear(); + } } diff --git a/100_core/src_120_basicDataType/gplx/DecimalAdp.java b/100_core/src_120_basicDataType/gplx/DecimalAdp.java deleted file mode 100644 index c0d528a50..000000000 --- a/100_core/src_120_basicDataType/gplx/DecimalAdp.java +++ /dev/null @@ -1,67 +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; -import java.math.BigDecimal; -import java.math.MathContext; -import java.math.RoundingMode; -import java.text.DecimalFormat; -public class DecimalAdp implements CompareAble { - public int compareTo(Object obj) {DecimalAdp comp = (DecimalAdp)obj; return under.compareTo(comp.under);} - - protected DecimalAdp(BigDecimal v) {this.under = v;} BigDecimal under; - protected DecimalAdp(int v) {this.under = new BigDecimal(v);} - public String Xto_str() { - BigDecimal tmp = under; - int tmp_scale = tmp.scale(); - if (tmp_scale <= -14) return tmp.toString(); // NOTE: if large number, call .toString which will return exponential notaion (1E##) instead of literal (1000....); 14 matches MW code; DATE:2015-04-10 - if (tmp_scale > 14) - tmp = tmp.setScale(14, RoundingMode.DOWN); // NOTE: if small number, round down to remove excessive zeroes; 14 matches PHP/C# values more closely; RoundingMode.Down for same reason; see E, Pi tests - return tmp .stripTrailingZeros() // NOTE: stripTrailingZeros for exp tests; EX: 120.0 -> 120; 0.01200000000000 -> .012 - .toPlainString(); // NOTE: toPlainString b/c stripTrailingZeros now converts 120 to 1.2E+2 (and any other value that is a multiple of 10) - } - public String Xto_str(String fmt) {return new DecimalFormat(fmt).format(under);} - @Override public String toString() {return under.toString();} - public boolean Eq(DecimalAdp v) {return v.under.doubleValue() == under.doubleValue();} - public BigDecimal Xto_decimal() {return under;} - public long Xto_long_mult_1000() {return under.movePointRight(3).longValue();} - public int Fraction1000() {return (int)(under.movePointRight(3).floatValue() % 1000);} - public double Xto_double() {return under.doubleValue();} - public int Xto_int() {return (int)under.doubleValue();} - public long Xto_long() {return (long)under.doubleValue();} - public DecimalAdp Op_add(DecimalAdp v) {return new DecimalAdp(under.add(v.under, DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_subtract(DecimalAdp v) {return new DecimalAdp(under.subtract(v.under, DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_mult(DecimalAdp v) {return new DecimalAdp(under.multiply(v.under));} - public DecimalAdp Op_mult(double v) {return new DecimalAdp(under.multiply(new BigDecimal(v, DecimalAdp_.Gplx_rounding_context)));} - public DecimalAdp Op_mult(long v) {return new DecimalAdp(under.multiply(new BigDecimal(v)));} - public DecimalAdp Op_divide(DecimalAdp v) {return new DecimalAdp(under.divide(v.under, DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_mod(DecimalAdp v) {return new DecimalAdp(under.remainder(v.under, DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_sqrt() {return new DecimalAdp(new BigDecimal(Math_.Sqrt(under.doubleValue())));} - public DecimalAdp Op_abs() {return new DecimalAdp(under.abs(DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_pow(int v) {return new DecimalAdp(under.pow(v, DecimalAdp_.Gplx_rounding_context));} - public DecimalAdp Op_truncate_decimal() {return new DecimalAdp(under.intValue());} - public DecimalAdp Op_round(int v) {return new DecimalAdp(under.setScale(v, RoundingMode.HALF_UP));} - public boolean Comp_gte(DecimalAdp v) {return under.doubleValue() >= v.under.doubleValue();} - public boolean Comp_gte(int v) {return under.doubleValue() >= v;} - public boolean Comp_lte(DecimalAdp v) {return under.doubleValue() <= v.under.doubleValue();} - public boolean Comp_lte(int v) {return under.doubleValue() <= v;} - public boolean Comp_gt(DecimalAdp v) {return under.doubleValue() > v.under.doubleValue();} - public boolean Comp_gt(int v) {return under.doubleValue() > v;} - public boolean Comp_lt(DecimalAdp v) {return under.doubleValue() < v.under.doubleValue();} - public boolean Comp_lt(int v) {return under.doubleValue() < v;} - public boolean Eq(int v) {return under.doubleValue() == v;} - } diff --git a/100_core/src_120_basicDataType/gplx/DecimalAdp_.java b/100_core/src_120_basicDataType/gplx/DecimalAdp_.java deleted file mode 100644 index a27e6b9f8..000000000 --- a/100_core/src_120_basicDataType/gplx/DecimalAdp_.java +++ /dev/null @@ -1,57 +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; -import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class DecimalAdp_ { - public static final Class Cls_ref_type = DecimalAdp.class; - public static DecimalAdp as_(Object obj) {return obj instanceof DecimalAdp ? (DecimalAdp)obj : null;} - public static final DecimalAdp Zero = new DecimalAdp(0); - public static final DecimalAdp One = new DecimalAdp(1); - public static final DecimalAdp Neg1 = new DecimalAdp(-1); - public static final DecimalAdp Const_e = DecimalAdp_.double_(Math_.E); - public static final DecimalAdp Const_pi = DecimalAdp_.double_(Math_.Pi); - public static DecimalAdp base1000_(long v) {return divide_(v, 1000);} - public static DecimalAdp parts_1000_(long num, int frc) {return divide_((num * (1000)) + frc, 1000);} - public static DecimalAdp parts_(long num, int frc) { - // int log10 = frc == 0 ? 0 : (Math_.Log10(frc) + 1); - // int pow10 = (int)Math_.Pow(10, log10); - int pow10 = XtoPow10(frc); - return divide_((num * (pow10)) + frc, pow10); - } - public static DecimalAdp cast_(Object obj) {return (DecimalAdp)obj;} - static int XtoPow10(int v) { - if (v > -1 && v < 10) return 10; - else if (v > 9 && v < 100) return 100; - else if (v > 99 && v < 1000) return 1000; - else if (v > 999 && v < 10000) return 10000; - else if (v > 9999 && v < 100000) return 100000; - else if (v > 99999 && v < 1000000) return 1000000; - else if (v > 999999 && v < 10000000) return 10000000; - else if (v > 9999999 && v < 100000000) return 100000000; - else if (v > 99999999 && v < 1000000000) return 1000000000; - else throw Err_.new_wo_type("value must be between 0 and 1 billion", "v", v); - } - public static String CalcPctStr(long dividend, long divisor, String fmt) { - if (divisor == 0) return "%ERR"; - return DecimalAdp_.float_(Float_.Div(dividend, divisor) * 100).Xto_str(fmt) + "%"; - } - public static DecimalAdp divide_safe_(long lhs, long rhs) {return rhs == 0 ? Zero : divide_(lhs, rhs);} - public static DecimalAdp divide_(long lhs, long rhs) { return new DecimalAdp(new BigDecimal(lhs).divide(new BigDecimal(rhs), Gplx_rounding_context)); } public static DecimalAdp int_(int v) {return new DecimalAdp(new BigDecimal(v));} public static DecimalAdp long_(long v) {return new DecimalAdp(new BigDecimal(v));} - public static DecimalAdp float_(float v) {return new DecimalAdp(new BigDecimal(v));} public static DecimalAdp double_(double v) {return new DecimalAdp(new BigDecimal(v));} - public static DecimalAdp double_thru_str_(double v) {return new DecimalAdp(BigDecimal.valueOf(v));} - public static DecimalAdp db_(Object v) {return new DecimalAdp((BigDecimal)v);} public static DecimalAdp parse_(String raw) {return new DecimalAdp(new BigDecimal(raw));} public static DecimalAdp pow_10_(int v) {return new DecimalAdp(new BigDecimal(1).scaleByPowerOfTen(v));} - public static final MathContext RoundDownContext = new MathContext(0, RoundingMode.DOWN); static final MathContext Gplx_rounding_context = new MathContext(28, RoundingMode.HALF_UP); } diff --git a/100_core/src_120_basicDataType/gplx/DecimalAdp__tst.java b/100_core/src_120_basicDataType/gplx/DecimalAdp__tst.java deleted file mode 100644 index 8e0db6b64..000000000 --- a/100_core/src_120_basicDataType/gplx/DecimalAdp__tst.java +++ /dev/null @@ -1,62 +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; -import org.junit.*; -public class DecimalAdp__tst { - @Test public void divide_() { - tst_divide_(1, 1000, "0.001"); - tst_divide_(1, 3, "0.33333333333333"); - tst_divide_(1, 7, "0.14285714285714"); - } void tst_divide_(int lhs, int rhs, String expd) {Tfds.Eq(expd, DecimalAdp_.divide_(lhs, rhs).Xto_str());} - @Test public void base1000_() { - tst_base1000_(1000, "1"); - tst_base1000_(1234, "1.234"); - tst_base1000_(123, "0.123"); - } void tst_base1000_(int val, String expd) {Tfds.Eq(expd, DecimalAdp_.base1000_(val).Xto_str());} - @Test public void parts_() { - tst_parts_(1, 0, "1"); - tst_parts_(1, 2, "1.2"); - tst_parts_(1, 23, "1.23"); - tst_parts_(123, 4567, "123.4567"); - } void tst_parts_(int num, int fracs, String expd) {Tfds.Eq(expd, DecimalAdp_.parts_(num, fracs).Xto_str());} - @Test public void parse_() { - tst_parse_("1", "1"); - tst_parse_("1.2", "1.2"); - tst_parse_("0.1", "0.1"); - } void tst_parse_(String raw, String expd) {Tfds.Eq(expd, DecimalAdp_.parse_(raw).Xto_str());} - @Test public void Truncate_decimal() { - tst_Truncate_decimal("1", "1"); - tst_Truncate_decimal("1.1", "1"); - tst_Truncate_decimal("1.9", "1"); - } void tst_Truncate_decimal(String raw, String expd) {Tfds.Eq(DecimalAdp_.parse_(expd).Xto_str(), DecimalAdp_.parse_(raw).Op_truncate_decimal().Xto_str());} - @Test public void Fraction1000() { - tst_Fraction1000(1, 1000, 1); // 0.001 - tst_Fraction1000(1, 3, 333); // 0.33333333 - tst_Fraction1000(1234, 1000, 234); // 1.234 - tst_Fraction1000(12345, 10000, 234); // 1.2345 - } void tst_Fraction1000(int lhs, int rhs, int expd) {Tfds.Eq(expd, DecimalAdp_.divide_(lhs, rhs).Fraction1000());} - @Test public void Lt() { - tst_Lt(1,123, 2, true); - tst_Lt(1,99999999, 2, true); - } void tst_Lt(int lhsNum, int lhsFrc, int rhs, boolean expd) {Tfds.Eq(expd, DecimalAdp_.parts_(lhsNum, lhsFrc).Comp_lt(rhs));} - @Test public void XtoStr_fmt() { - tst_XtoStr_fmt(1, 2, "0.0", "0.5"); - tst_XtoStr_fmt(1, 3, "0.0", "0.3"); - tst_XtoStr_fmt(10000, 7, "0,000.000", "1,428.571"); - } void tst_XtoStr_fmt(int l, int r, String fmt, String expd) {Tfds.Eq(expd, DecimalAdp_.divide_(l, r).Xto_str(fmt));} -} diff --git a/100_core/src_120_basicDataType/gplx/Decimal_adp.java b/100_core/src_120_basicDataType/gplx/Decimal_adp.java new file mode 100644 index 000000000..b8602e811 --- /dev/null +++ b/100_core/src_120_basicDataType/gplx/Decimal_adp.java @@ -0,0 +1,91 @@ +/* +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; +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.text.DecimalFormat; +public class Decimal_adp implements CompareAble { + public int compareTo(Object obj) {Decimal_adp comp = (Decimal_adp)obj; return under.compareTo(comp.under);} + + protected Decimal_adp(BigDecimal v) {this.under = v;} private final BigDecimal under; + protected Decimal_adp(int v) {this.under = new BigDecimal(v);} + public Object Under() {return under;} + public BigDecimal Under_as_native() {return under;} + public int Precision() {return under.precision();} + public int Frac_1000() {return (int)(under.movePointRight(3).floatValue() % 1000);} + public boolean Eq(Decimal_adp v) {return v.under.doubleValue() == under.doubleValue();} + public boolean Eq(int v) {return under.doubleValue() == v;} + public String To_str() { + BigDecimal tmp = under; + int tmp_scale = tmp.scale(); + if (tmp_scale <= -14) return tmp.toString(); // NOTE: if large number, call .toString which will return exponential notaion (1E##) instead of literal (1000....); 14 matches MW code; DATE:2015-04-10 + if (tmp_scale > 14) + tmp = tmp.setScale(14, RoundingMode.DOWN); // NOTE: if small number, round down to remove excessive zeroes; 14 matches PHP/C# values more closely; RoundingMode.Down for same reason; see E, Pi tests + return tmp .stripTrailingZeros() // NOTE: stripTrailingZeros for exp tests; EX: 120.0 -> 120; 0.01200000000000 -> .012 + .toPlainString(); // NOTE: toPlainString b/c stripTrailingZeros now converts 120 to 1.2E+2 (and any other value that is a multiple of 10) + } + public String To_str(String fmt) {return new DecimalFormat(fmt).format(under);} + @Override public String toString() {return under.toString();} + public int To_int() {return (int)under.doubleValue();} + public long To_long() {return (long)under.doubleValue();} + public long To_long_mult_1000() {return under.movePointRight(3).longValue();} + public double To_double() {return under.doubleValue();} + public Decimal_adp Add(Decimal_adp v) {return new Decimal_adp(under.add(v.under, Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Subtract(Decimal_adp v) {return new Decimal_adp(under.subtract(v.under, Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Multiply(Decimal_adp v) {return new Decimal_adp(under.multiply(v.under));} + public Decimal_adp Multiply(double v) {return new Decimal_adp(under.multiply(new BigDecimal(v, Decimal_adp_.Gplx_rounding_context)));} + public Decimal_adp Multiply(long v) {return new Decimal_adp(under.multiply(new BigDecimal(v)));} + public Decimal_adp Divide(Decimal_adp v) {return new Decimal_adp(under.divide(v.under, Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Mod(Decimal_adp v) {return new Decimal_adp(under.remainder(v.under, Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Abs() {return new Decimal_adp(under.abs(Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Pow(int v) {return new Decimal_adp(under.pow(v, Decimal_adp_.Gplx_rounding_context));} + public Decimal_adp Sqrt() {return new Decimal_adp(new BigDecimal(Math_.Sqrt(under.doubleValue())));} + public Decimal_adp Truncate() {return new Decimal_adp(under.intValue());} + public Decimal_adp Round_old(int v) {return new Decimal_adp(under.setScale(v, RoundingMode.HALF_UP));} + public Decimal_adp Round(int v) { + BigDecimal new_val = null; + if (v > 0) { + new_val = under.setScale(v, RoundingMode.HALF_UP); + } + else { + int actl_places = under.precision() - under.scale(); + int reqd_places = -v; + if (reqd_places < actl_places) + new_val = under.round(new java.math.MathContext(actl_places - reqd_places, RoundingMode.HALF_UP)); + else if (reqd_places == actl_places) { + int base_10 = (int)Math_.Pow(10, reqd_places - 1); + if (under.intValue() / base_10 < 5) + new_val = BigDecimal.ZERO; + else + new_val = new BigDecimal(Math_.Pow(10, reqd_places)); + } + else + new_val = BigDecimal.ZERO; + } + return new Decimal_adp(new_val); + } + public boolean Comp_gte(Decimal_adp v) {return under.doubleValue() >= v.under.doubleValue();} + public boolean Comp_gte(int v) {return under.doubleValue() >= v;} + public boolean Comp_lte(Decimal_adp v) {return under.doubleValue() <= v.under.doubleValue();} + public boolean Comp_lte(int v) {return under.doubleValue() <= v;} + public boolean Comp_gt(Decimal_adp v) {return under.doubleValue() > v.under.doubleValue();} + public boolean Comp_gt(int v) {return under.doubleValue() > v;} + public boolean Comp_lt(Decimal_adp v) {return under.doubleValue() < v.under.doubleValue();} + public boolean Comp_lt(int v) {return under.doubleValue() < v;} + } diff --git a/100_core/src_120_basicDataType/gplx/Decimal_adp_.java b/100_core/src_120_basicDataType/gplx/Decimal_adp_.java new file mode 100644 index 000000000..09fb3930c --- /dev/null +++ b/100_core/src_120_basicDataType/gplx/Decimal_adp_.java @@ -0,0 +1,57 @@ +/* +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; +import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class Decimal_adp_ { + public static final Class Cls_ref_type = Decimal_adp.class; + public static Decimal_adp as_(Object obj) {return obj instanceof Decimal_adp ? (Decimal_adp)obj : null;} + public static final Decimal_adp Zero = new Decimal_adp(0); + public static final Decimal_adp One = new Decimal_adp(1); + public static final Decimal_adp Neg1 = new Decimal_adp(-1); + public static final Decimal_adp Const_e = Decimal_adp_.double_(Math_.E); + public static final Decimal_adp Const_pi = Decimal_adp_.double_(Math_.Pi); + public static Decimal_adp base1000_(long v) {return divide_(v, 1000);} + public static Decimal_adp parts_1000_(long num, int frc) {return divide_((num * (1000)) + frc, 1000);} + public static Decimal_adp parts_(long num, int frc) { + // int log10 = frc == 0 ? 0 : (Math_.Log10(frc) + 1); + // int pow10 = (int)Math_.Pow(10, log10); + int pow10 = XtoPow10(frc); + return divide_((num * (pow10)) + frc, pow10); + } + public static Decimal_adp cast_(Object obj) {return (Decimal_adp)obj;} + static int XtoPow10(int v) { + if (v > -1 && v < 10) return 10; + else if (v > 9 && v < 100) return 100; + else if (v > 99 && v < 1000) return 1000; + else if (v > 999 && v < 10000) return 10000; + else if (v > 9999 && v < 100000) return 100000; + else if (v > 99999 && v < 1000000) return 1000000; + else if (v > 999999 && v < 10000000) return 10000000; + else if (v > 9999999 && v < 100000000) return 100000000; + else if (v > 99999999 && v < 1000000000) return 1000000000; + else throw Err_.new_wo_type("value must be between 0 and 1 billion", "v", v); + } + public static String CalcPctStr(long dividend, long divisor, String fmt) { + if (divisor == 0) return "%ERR"; + return Decimal_adp_.float_(Float_.Div(dividend, divisor) * 100).To_str(fmt) + "%"; + } + public static Decimal_adp divide_safe_(long lhs, long rhs) {return rhs == 0 ? Zero : divide_(lhs, rhs);} + public static Decimal_adp divide_(long lhs, long rhs) { return new Decimal_adp(new BigDecimal(lhs).divide(new BigDecimal(rhs), Gplx_rounding_context)); } public static Decimal_adp int_(int v) {return new Decimal_adp(new BigDecimal(v));} public static Decimal_adp long_(long v) {return new Decimal_adp(new BigDecimal(v));} + public static Decimal_adp float_(float v) {return new Decimal_adp(new BigDecimal(v));} public static Decimal_adp double_(double v) {return new Decimal_adp(new BigDecimal(v));} + public static Decimal_adp double_thru_str_(double v) {return new Decimal_adp(BigDecimal.valueOf(v));} + public static Decimal_adp db_(Object v) {return new Decimal_adp((BigDecimal)v);} public static Decimal_adp parse_(String raw) {return new Decimal_adp(new BigDecimal(raw));} public static Decimal_adp pow_10_(int v) {return new Decimal_adp(new BigDecimal(1).scaleByPowerOfTen(v));} + public static final MathContext RoundDownContext = new MathContext(0, RoundingMode.DOWN); public static final MathContext Gplx_rounding_context = new MathContext(14, RoundingMode.HALF_UP); // changed from 28 to 14; DATE:2015-07-31 } diff --git a/100_core/src_120_basicDataType/gplx/Decimal_adp__tst.java b/100_core/src_120_basicDataType/gplx/Decimal_adp__tst.java new file mode 100644 index 000000000..901f6a40e --- /dev/null +++ b/100_core/src_120_basicDataType/gplx/Decimal_adp__tst.java @@ -0,0 +1,87 @@ +/* +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; +import org.junit.*; +public class Decimal_adp__tst { + private final Decimal_adp__fxt fxt = new Decimal_adp__fxt(); + @Test public void divide_() { + fxt.Test_divide(1, 1000, "0.001"); + fxt.Test_divide(1, 3, "0.33333333333333"); + fxt.Test_divide(1, 7, "0.14285714285714"); + } + @Test public void base1000_() { + fxt.Test_base_1000(1000, "1"); + fxt.Test_base_1000(1234, "1.234"); + fxt.Test_base_1000(123, "0.123"); + } + @Test public void parts_() { + fxt.Test_parts(1, 0, "1"); + fxt.Test_parts(1, 2, "1.2"); + fxt.Test_parts(1, 23, "1.23"); + fxt.Test_parts(123, 4567, "123.4567"); + } + @Test public void parse_() { + fxt.Test_parse("1", "1"); + fxt.Test_parse("1.2", "1.2"); + fxt.Test_parse("0.1", "0.1"); + } + @Test public void Truncate_decimal() { + fxt.Test_truncate_decimal("1", "1"); + fxt.Test_truncate_decimal("1.1", "1"); + fxt.Test_truncate_decimal("1.9", "1"); + } + @Test public void Fraction1000() { + fxt.Test_frac_1000(1, 1000, 1); // 0.001 + fxt.Test_frac_1000(1, 3, 333); // 0.33333333 + fxt.Test_frac_1000(1234, 1000, 234); // 1.234 + fxt.Test_frac_1000(12345, 10000, 234); // 1.2345 + } + @Test public void Lt() { + fxt.Test_comp_lt(1,123, 2, true); + fxt.Test_comp_lt(1,99999999, 2, true); + } + @Test public void To_str_fmt() { + fxt.Test_to_str_fmt(1, 2, "0.0", "0.5"); + fxt.Test_to_str_fmt(1, 3, "0.0", "0.3"); + fxt.Test_to_str_fmt(10000, 7, "0,000.000", "1,428.571"); + } + @Test public void Round() { + fxt.Test_round("123.456", 3, "123.456"); + fxt.Test_round("123.456", 2, "123.46"); + fxt.Test_round("123.456", 1, "123.5"); + fxt.Test_round("123.456", 0, "123"); + fxt.Test_round("123.456", -1, "120"); + fxt.Test_round("123.456", -2, "100"); + fxt.Test_round("123.456", -3, "0"); + + fxt.Test_round("6", -1, "10"); + fxt.Test_round("5", -1, "10"); + fxt.Test_round("6", -2, "0"); + } +} +class Decimal_adp__fxt { + public void Test_divide(int lhs, int rhs, String expd) {Tfds.Eq(expd, Decimal_adp_.divide_(lhs, rhs).To_str());} + public void Test_base_1000(int val, String expd) {Tfds.Eq(expd, Decimal_adp_.base1000_(val).To_str());} + public void Test_parts(int num, int fracs, String expd) {Tfds.Eq(expd, Decimal_adp_.parts_(num, fracs).To_str());} + public void Test_parse(String raw, String expd) {Tfds.Eq(expd, Decimal_adp_.parse_(raw).To_str());} + public void Test_truncate_decimal(String raw, String expd) {Tfds.Eq(Decimal_adp_.parse_(expd).To_str(), Decimal_adp_.parse_(raw).Truncate().To_str());} + public void Test_frac_1000(int lhs, int rhs, int expd) {Tfds.Eq(expd, Decimal_adp_.divide_(lhs, rhs).Frac_1000());} + public void Test_comp_lt(int lhsNum, int lhsFrc, int rhs, boolean expd) {Tfds.Eq(expd, Decimal_adp_.parts_(lhsNum, lhsFrc).Comp_lt(rhs));} + public void Test_to_str_fmt(int l, int r, String fmt, String expd) {Tfds.Eq(expd, Decimal_adp_.divide_(l, r).To_str(fmt));} + public void Test_round(String raw, int places, String expd) {Tfds.Eq_str(expd, Decimal_adp_.parse_(raw).Round(places).To_str(), "round");} +} diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java index af14af134..7ab01cb26 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java @@ -19,11 +19,11 @@ package gplx; import gplx.core.strings.*; public class TimeSpanAdp implements CompareAble, EqAble { public long Fracs() {return fracs;} long fracs; public int FracsAsInt() {return (int)fracs;} - public DecimalAdp TotalSecs() { - return DecimalAdp_.divide_(fracs, TimeSpanAdp_.Divisors[TimeSpanAdp_.Idx_Sec]); + public Decimal_adp TotalSecs() { + return Decimal_adp_.divide_(fracs, TimeSpanAdp_.Divisors[TimeSpanAdp_.Idx_Sec]); } - public DecimalAdp Total_days() { - return DecimalAdp_.divide_(fracs, TimeSpanAdp_.Divisors[TimeSpanAdp_.Idx_Hour] * 24); + public Decimal_adp Total_days() { + return Decimal_adp_.divide_(fracs, TimeSpanAdp_.Divisors[TimeSpanAdp_.Idx_Hour] * 24); } public int[] Units() {return TimeSpanAdp_.Split_long(fracs, TimeSpanAdp_.Divisors);} public int Units_fracs() { diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java index 0d9eb9889..b2ae64542 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java @@ -25,8 +25,8 @@ public class TimeSpanAdp_ { long fracs = (long)(seconds * Divisors[Idx_Sec]); return new TimeSpanAdp(fracs); } - public static TimeSpanAdp decimal_(DecimalAdp seconds) { - return new TimeSpanAdp(seconds.Xto_long_mult_1000()); + public static TimeSpanAdp decimal_(Decimal_adp seconds) { + return new TimeSpanAdp(seconds.To_long_mult_1000()); } public static TimeSpanAdp units_(int frc, int sec, int min, int hour) { int[] units = new int[] {frc, sec, min, hour}; diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_basic_tst.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_basic_tst.java index f7a94ca75..cb13d5283 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_basic_tst.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_basic_tst.java @@ -25,7 +25,7 @@ public class TimeSpanAdp_basic_tst { } @Test public void TotalSecs() { TimeSpanAdp val = TimeSpanAdp_.fracs_(1987); - Tfds.Eq_decimal(DecimalAdp_.parts_(1, 987), val.TotalSecs()); + Tfds.Eq_decimal(Decimal_adp_.parts_(1, 987), val.TotalSecs()); } @Test public void Units() { tst_Units("01:02:03.987", 1, 2, 3, 987); diff --git a/100_core/src_140_list/gplx/Hash_adp_bry.java b/100_core/src_140_list/gplx/Hash_adp_bry.java index 89c1440c7..30c27544d 100644 --- a/100_core/src_140_list/gplx/Hash_adp_bry.java +++ b/100_core/src_140_list/gplx/Hash_adp_bry.java @@ -22,7 +22,7 @@ public class Hash_adp_bry extends gplx.lists.Hash_adp_base implements Hash_adp { private final Hash_adp_bry_itm_base proto, key_ref; Hash_adp_bry(Hash_adp_bry_itm_base proto) { this.proto = proto; - key_ref = proto.New(); + this.key_ref = proto.New(); } @Override protected Object Fetch_base(Object key) {return super.Fetch_base(key_ref.Init((byte[])key));} @Override protected void Del_base(Object key) {super.Del_base(key_ref.Init((byte[])key));} @@ -55,10 +55,10 @@ public class Hash_adp_bry extends gplx.lists.Hash_adp_base implements Hash_adp { key_itm.Init(key_bry, 0, key_bry.length); super.Add_base(key_itm, val); } - public static Hash_adp_bry cs_() {return new Hash_adp_bry(Hash_adp_bry_itm_cs._);} - public static Hash_adp_bry ci_ascii_() {return new Hash_adp_bry(Hash_adp_bry_itm_ci_ascii._);} - public static Hash_adp_bry ci_utf8_(Gfo_case_mgr case_mgr) {return new Hash_adp_bry(Hash_adp_bry_itm_ci_utf8.get_or_new(case_mgr));} - public static Hash_adp_bry c__utf8_(boolean case_match, Gfo_case_mgr case_mgr) {return case_match ? cs_() : ci_utf8_(case_mgr);} + public static Hash_adp_bry cs() {return new Hash_adp_bry(Hash_adp_bry_itm_cs._);} + public static Hash_adp_bry ci_a7() {return new Hash_adp_bry(Hash_adp_bry_itm_ci_a7._);} + public static Hash_adp_bry ci_u8(Gfo_case_mgr case_mgr) {return new Hash_adp_bry(Hash_adp_bry_itm_ci_u8.get_or_new(case_mgr));} + public static Hash_adp_bry c__u8(boolean case_match, Gfo_case_mgr case_mgr) {return case_match ? cs() : ci_u8(case_mgr);} } abstract class Hash_adp_bry_itm_base { public abstract Hash_adp_bry_itm_base New(); @@ -92,9 +92,9 @@ class Hash_adp_bry_itm_cs extends Hash_adp_bry_itm_base { } public static final Hash_adp_bry_itm_cs _ = new Hash_adp_bry_itm_cs(); Hash_adp_bry_itm_cs() {} } -class Hash_adp_bry_itm_ci_ascii extends Hash_adp_bry_itm_base { +class Hash_adp_bry_itm_ci_a7 extends Hash_adp_bry_itm_base { private byte[] src; int src_bgn, src_end; - @Override public Hash_adp_bry_itm_base New() {return new Hash_adp_bry_itm_ci_ascii();} + @Override public Hash_adp_bry_itm_base New() {return new Hash_adp_bry_itm_ci_a7();} @Override public Hash_adp_bry_itm_base Init(byte[] src, int src_bgn, int src_end) {this.src = src; this.src_bgn = src_bgn; this.src_end = src_end; return this;} @Override public int hashCode() { int rv = 0; @@ -108,7 +108,7 @@ class Hash_adp_bry_itm_ci_ascii extends Hash_adp_bry_itm_base { } @Override public boolean equals(Object obj) { if (obj == null) return false; - Hash_adp_bry_itm_ci_ascii comp = (Hash_adp_bry_itm_ci_ascii)obj; + Hash_adp_bry_itm_ci_a7 comp = (Hash_adp_bry_itm_ci_a7)obj; byte[] comp_src = comp.src; int comp_bgn = comp.src_bgn, comp_end = comp.src_end; int comp_len = comp_end - comp_bgn, src_len = src_end - src_bgn; if (comp_len != src_len) return false; @@ -123,13 +123,13 @@ class Hash_adp_bry_itm_ci_ascii extends Hash_adp_bry_itm_base { } return true; } - public static final Hash_adp_bry_itm_ci_ascii _ = new Hash_adp_bry_itm_ci_ascii(); Hash_adp_bry_itm_ci_ascii() {} + public static final Hash_adp_bry_itm_ci_a7 _ = new Hash_adp_bry_itm_ci_a7(); Hash_adp_bry_itm_ci_a7() {} } -class Hash_adp_bry_itm_ci_utf8 extends Hash_adp_bry_itm_base { +class Hash_adp_bry_itm_ci_u8 extends Hash_adp_bry_itm_base { private final Gfo_case_mgr case_mgr; - Hash_adp_bry_itm_ci_utf8(Gfo_case_mgr case_mgr) {this.case_mgr = case_mgr;} + Hash_adp_bry_itm_ci_u8(Gfo_case_mgr case_mgr) {this.case_mgr = case_mgr;} private byte[] src; int src_bgn, src_end; - @Override public Hash_adp_bry_itm_base New() {return new Hash_adp_bry_itm_ci_utf8(case_mgr);} + @Override public Hash_adp_bry_itm_base New() {return new Hash_adp_bry_itm_ci_u8(case_mgr);} @Override public Hash_adp_bry_itm_base Init(byte[] src, int src_bgn, int src_end) {this.src = src; this.src_bgn = src_bgn; this.src_end = src_end; return this;} @Override public int hashCode() { int rv = 0; @@ -149,7 +149,7 @@ class Hash_adp_bry_itm_ci_utf8 extends Hash_adp_bry_itm_base { } @Override public boolean equals(Object obj) { if (obj == null) return false; - Hash_adp_bry_itm_ci_utf8 trg_itm = (Hash_adp_bry_itm_ci_utf8)obj; + Hash_adp_bry_itm_ci_u8 trg_itm = (Hash_adp_bry_itm_ci_u8)obj; byte[] trg = trg_itm.src; int trg_bgn = trg_itm.src_bgn, trg_end = trg_itm.src_end; int src_c_bgn = src_bgn; int trg_c_bgn = trg_bgn; @@ -176,13 +176,13 @@ class Hash_adp_bry_itm_ci_utf8 extends Hash_adp_bry_itm_base { } return src_c_bgn == src_end && trg_c_bgn == trg_end; // only return true if both src and trg read to end of their brys, otherwise "a","ab" will match } - public static Hash_adp_bry_itm_ci_utf8 get_or_new(Gfo_case_mgr case_mgr) { + public static Hash_adp_bry_itm_ci_u8 get_or_new(Gfo_case_mgr case_mgr) { switch (case_mgr.Tid()) { - case Gfo_case_mgr_.Tid_ascii: if (Itm_ascii == null) Itm_ascii = new Hash_adp_bry_itm_ci_utf8(case_mgr); return Itm_ascii; - case Gfo_case_mgr_.Tid_utf8: if (Itm_utf8 == null) Itm_utf8 = new Hash_adp_bry_itm_ci_utf8(case_mgr); return Itm_utf8; - case Gfo_case_mgr_.Tid_custom: return new Hash_adp_bry_itm_ci_utf8(case_mgr); + case Gfo_case_mgr_.Tid_a7: if (Itm_a7 == null) Itm_a7 = new Hash_adp_bry_itm_ci_u8(case_mgr); return Itm_a7; + case Gfo_case_mgr_.Tid_u8: if (Itm_u8 == null) Itm_u8 = new Hash_adp_bry_itm_ci_u8(case_mgr); return Itm_u8; + case Gfo_case_mgr_.Tid_custom: return new Hash_adp_bry_itm_ci_u8(case_mgr); default: throw Err_.new_unhandled(case_mgr.Tid()); } } - private static Hash_adp_bry_itm_ci_utf8 Itm_ascii, Itm_utf8; + private static Hash_adp_bry_itm_ci_u8 Itm_a7, Itm_u8; } diff --git a/100_core/src_140_list/gplx/Hash_adp_bry_tst.java b/100_core/src_140_list/gplx/Hash_adp_bry_tst.java index a489e5b81..71396bdda 100644 --- a/100_core/src_140_list/gplx/Hash_adp_bry_tst.java +++ b/100_core/src_140_list/gplx/Hash_adp_bry_tst.java @@ -48,8 +48,8 @@ public class Hash_adp_bry_tst { class Hash_adp_bry_fxt { Hash_adp_bry hash; public void Clear() {} - public Hash_adp_bry_fxt New_cs() {hash = Hash_adp_bry.cs_(); return this;} - public Hash_adp_bry_fxt New_ci() {hash = Hash_adp_bry.ci_ascii_(); return this;} + public Hash_adp_bry_fxt New_cs() {hash = Hash_adp_bry.cs(); return this;} + public Hash_adp_bry_fxt New_ci() {hash = Hash_adp_bry.ci_a7(); return this;} public Hash_adp_bry_fxt Add(String key) {byte[] key_bry = Bry_.new_u8(key); hash.Add(key_bry, key_bry); return this;} public Hash_adp_bry_fxt Count_tst(int expd) {Tfds.Eq(expd, hash.Count()); return this;} public Hash_adp_bry_fxt Get_bry_tst(String key) {return Get_bry_tst(key, key);} diff --git a/100_core/src_150_text/gplx/intl/Gfo_case_mgr_.java b/100_core/src_150_text/gplx/intl/Gfo_case_mgr_.java index 6f026c305..70230673d 100644 --- a/100_core/src_150_text/gplx/intl/Gfo_case_mgr_.java +++ b/100_core/src_150_text/gplx/intl/Gfo_case_mgr_.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.intl; import gplx.*; public class Gfo_case_mgr_ { - public static final byte Tid_ascii = 0, Tid_utf8 = 1, Tid_custom = 2; + public static final byte Tid_a7 = 0, Tid_u8 = 1, Tid_custom = 2; } diff --git a/100_core/src_200_io/gplx/ios/Io_size_.java b/100_core/src_200_io/gplx/ios/Io_size_.java index b68986bae..79186b104 100644 --- a/100_core/src_200_io/gplx/ios/Io_size_.java +++ b/100_core/src_200_io/gplx/ios/Io_size_.java @@ -24,24 +24,24 @@ public class Io_size_ { pow++; } long div = (long)Math_.Pow((long)1024, (long)pow); - DecimalAdp valDecimal = DecimalAdp_.divide_(val, div); + Decimal_adp valDecimal = Decimal_adp_.divide_(val, div); String[] unit = Io_size_.Units[pow]; - return valDecimal.Xto_str("#,##0.000") + " " + String_.PadBgn(unit[0], 2, " "); + return valDecimal.To_str("#,##0.000") + " " + String_.PadBgn(unit[0], 2, " "); } public static String To_str(long val, int exp_1024, String val_fmt, String unit_pad, boolean round_0_to_1) { long exp_val = (long)Math_.Pow(1024, exp_1024); - DecimalAdp val_as_decimal = DecimalAdp_.divide_(val, exp_val); - if (round_0_to_1 && val_as_decimal.Comp_lt(1)) val_as_decimal = DecimalAdp_.One; + Decimal_adp val_as_decimal = Decimal_adp_.divide_(val, exp_val); + if (round_0_to_1 && val_as_decimal.Comp_lt(1)) val_as_decimal = Decimal_adp_.One; String[] unit = Io_size_.Units[exp_1024]; - return val_as_decimal.Xto_str(val_fmt) + " " + String_.PadBgn(unit[0], 2, unit_pad); + return val_as_decimal.To_str(val_fmt) + " " + String_.PadBgn(unit[0], 2, unit_pad); } public static long parse_or_(String raw, long or) { if (raw == null || raw == String_.Empty) return or; String[] terms = String_.Split(raw, " "); int termsLen = Array_.Len(terms); if (termsLen > 2) return or; - DecimalAdp val = null; - try {val = DecimalAdp_.parse_(terms[0]);} catch (Exception exc) {Err_.Noop(exc); return or;} + Decimal_adp val = null; + try {val = Decimal_adp_.parse_(terms[0]);} catch (Exception exc) {Err_.Noop(exc); return or;} int unitPow = 0; if (termsLen > 1) { @@ -50,13 +50,13 @@ public class Io_size_ { } int curPow = unitPow; while (curPow > 0) { - val = val.Op_mult(1024); + val = val.Multiply(1024); curPow--; } // DELETED:do not check for fractional bytes; EX: 10.7 GB DATE:2015-01-06 - // DecimalAdp comp = val.Op_truncate_decimal(); + // Decimal_adp comp = val.Op_truncate_decimal(); // if (!val.Eq(comp)) return or; - return val.Xto_long(); + return val.To_long(); } private static int parse_unitPow_(String unitStr) { int unitLen = Array_.Len(Units); @@ -108,8 +108,8 @@ class Io_size_fmtr_arg implements Bry_fmtr_arg { pow++; } long div = (long)Math_.Pow((long)1024, (long)pow); - DecimalAdp val_decimal = DecimalAdp_.divide_(val, div); - bfr.Add_str(val_decimal.Xto_str("#,###.000")).Add_byte(Byte_ascii.Space).Add(gplx.ios.Io_size_.Units_bry[pow]); + Decimal_adp val_decimal = Decimal_adp_.divide_(val, div); + bfr.Add_str(val_decimal.To_str("#,###.000")).Add_byte(Byte_ascii.Space).Add(gplx.ios.Io_size_.Units_bry[pow]); if (suffix != null) bfr.Add(suffix); } diff --git a/100_core/src_300_classXtn/gplx/DecimalAdpClassXtn.java b/100_core/src_300_classXtn/gplx/DecimalAdpClassXtn.java index 73fe24814..aebc3ad0b 100644 --- a/100_core/src_300_classXtn/gplx/DecimalAdpClassXtn.java +++ b/100_core/src_300_classXtn/gplx/DecimalAdpClassXtn.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx; public class DecimalAdpClassXtn extends ClassXtn_base implements ClassXtn { public String Key() {return Key_const;} public static final String Key_const = "decimal"; // current dsv files reference "decimal" - @Override public Class UnderClass() {return DecimalAdp.class;} + @Override public Class UnderClass() {return Decimal_adp.class;} public Object DefaultValue() {return 0;} - public boolean Eq(Object lhs, Object rhs) {try {return DecimalAdp_.cast_(lhs).Eq(DecimalAdp_.cast_(rhs));} catch (Exception e) {Err_.Noop(e); return false;}} - @Override public Object ParseOrNull(String raw) {return DecimalAdp_.parse_(raw);} - @Override public String XtoUi(Object obj, String fmt) {return DecimalAdp_.cast_(obj).Xto_str();} + public boolean Eq(Object lhs, Object rhs) {try {return Decimal_adp_.cast_(lhs).Eq(Decimal_adp_.cast_(rhs));} catch (Exception e) {Err_.Noop(e); return false;}} + @Override public Object ParseOrNull(String raw) {return Decimal_adp_.parse_(raw);} + @Override public String XtoUi(Object obj, String fmt) {return Decimal_adp_.cast_(obj).To_str();} public static final DecimalAdpClassXtn _ = new DecimalAdpClassXtn(); DecimalAdpClassXtn() {} // added to ClassXtnPool by default } diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg.java b/100_core/src_311_gfoObj/gplx/GfoMsg.java index 540e781b8..c2c87386a 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg.java @@ -47,8 +47,8 @@ public interface GfoMsg { double ReadDoubleOr(String k, double or); DateAdp ReadDate(String k); DateAdp ReadDateOr(String k, DateAdp or); - DecimalAdp ReadDecimal(String k); - DecimalAdp ReadDecimalOr(String k, DecimalAdp or); + Decimal_adp ReadDecimal(String k); + Decimal_adp ReadDecimalOr(String k, Decimal_adp or); String ReadStr(String k); String ReadStrOr(String k, String or); Io_url ReadIoUrl(String k); diff --git a/100_core/src_311_gfoObj/gplx/GfoMsgUtl.java b/100_core/src_311_gfoObj/gplx/GfoMsgUtl.java index 0e5e65dec..4bfea3995 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsgUtl.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsgUtl.java @@ -21,5 +21,5 @@ public class GfoMsgUtl { public static boolean SetBool(GfsCtx ctx, GfoMsg m, boolean cur) {return ctx.Deny() ? cur : m.ReadBoolOr("v", cur);} public static String SetStr(GfsCtx ctx, GfoMsg m, String cur) {return ctx.Deny() ? cur : m.ReadStrOr("v", cur);} public static Io_url SetIoUrl(GfsCtx ctx, GfoMsg m, Io_url cur) {return ctx.Deny() ? cur : m.ReadIoUrlOr("v", cur);} - public static DecimalAdp SetDecimal(GfsCtx ctx, GfoMsg m, DecimalAdp cur) {return ctx.Deny() ? cur : m.ReadDecimalOr("v", cur);} + public static Decimal_adp SetDecimal(GfsCtx ctx, GfoMsg m, Decimal_adp cur) {return ctx.Deny() ? cur : m.ReadDecimalOr("v", cur);} } diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_.java b/100_core/src_311_gfoObj/gplx/GfoMsg_.java index 1f7447d60..f1706b6f0 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_.java @@ -138,7 +138,7 @@ class GfoMsg_base implements GfoMsg { public long ReadLong(String k) {Object rv = ReadOr(k, 0) ; if (rv == Nil) ThrowNotFound(k); return parse ? Long_.parse_((String)rv) : Long_.cast_(rv);} public float ReadFloat(String k) {Object rv = ReadOr(k, 0) ; if (rv == Nil) ThrowNotFound(k); return parse ? Float_.parse_((String)rv) : Float_.cast_(rv);} public double ReadDouble(String k) {Object rv = ReadOr(k, 0) ; if (rv == Nil) ThrowNotFound(k); return parse ? Double_.parse_((String)rv) : Double_.cast_(rv);} - public DecimalAdp ReadDecimal(String k) {Object rv = ReadOr(k, 0) ; if (rv == Nil) ThrowNotFound(k); return parse ? DecimalAdp_.parse_((String)rv) : DecimalAdp_.cast_(rv);} + public Decimal_adp ReadDecimal(String k) {Object rv = ReadOr(k, 0) ; if (rv == Nil) ThrowNotFound(k); return parse ? Decimal_adp_.parse_((String)rv) : Decimal_adp_.cast_(rv);} public String ReadStr(String k) {Object rv = ReadOr(k, null); if (rv == Nil) ThrowNotFound(k); return (String)rv;} public DateAdp ReadDate(String k) {Object rv = ReadOr(k, null); if (rv == Nil) ThrowNotFound(k); return parse ? DateAdp_.parse_gplx((String)rv) : DateAdp_.cast_(rv);} public Io_url ReadIoUrl(String k) {Object rv = ReadOr(k, null); if (rv == Nil) ThrowNotFound(k); return parse ? Io_url_.new_any_((String)rv) : Io_url_.cast_(rv);} @@ -148,7 +148,7 @@ class GfoMsg_base implements GfoMsg { public long ReadLongOr(String k, long or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return parse ? Long_.parse_((String)rv) : Long_.cast_(rv);} public float ReadFloatOr(String k, float or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return parse ? Float_.parse_((String)rv) : Float_.cast_(rv);} public double ReadDoubleOr(String k,double or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return parse ? Double_.parse_((String)rv) : Double_.cast_(rv);} - public DecimalAdp ReadDecimalOr(String k,DecimalAdp or) {Object rv = ReadOr(k, or); if (rv == Nil) return or ; return parse ? DecimalAdp_.parse_((String)rv) : DecimalAdp_.cast_(rv);} + public Decimal_adp ReadDecimalOr(String k,Decimal_adp or) {Object rv = ReadOr(k, or); if (rv == Nil) return or ; return parse ? Decimal_adp_.parse_((String)rv) : Decimal_adp_.cast_(rv);} public String ReadStrOr(String k, String or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return (String)rv;} public DateAdp ReadDateOr(String k, DateAdp or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return parse ? DateAdp_.parse_gplx((String)rv) : DateAdp_.cast_(rv);} public Io_url ReadIoUrlOr(String k, Io_url or) {Object rv = ReadOr(k, or) ; if (rv == Nil) return or ; return parse ? Io_url_.new_any_((String)rv) : Io_url_.cast_(rv);} diff --git a/100_core/src_330_store/gplx/DataRdr.java b/100_core/src_330_store/gplx/DataRdr.java index f75377171..3e058c1e7 100644 --- a/100_core/src_330_store/gplx/DataRdr.java +++ b/100_core/src_330_store/gplx/DataRdr.java @@ -39,7 +39,7 @@ public interface DataRdr extends SrlMgr, RlsAble { double ReadDouble(String key); double ReadDoubleOr(String key, double or); float ReadFloat(String key); float ReadFloatOr(String key, float or); byte ReadByte(String key); byte ReadByteOr(String key, byte or); - DecimalAdp ReadDecimal(String key); DecimalAdp ReadDecimalOr(String key, DecimalAdp or); + Decimal_adp ReadDecimal(String key); Decimal_adp ReadDecimalOr(String key, Decimal_adp or); DateAdp ReadDate(String key); DateAdp ReadDateOr(String key, DateAdp or); gplx.ios.Io_stream_rdr ReadRdr(String key); diff --git a/100_core/src_330_store/gplx/DataRdr_.java b/100_core/src_330_store/gplx/DataRdr_.java index ef2ffb1a3..e04805888 100644 --- a/100_core/src_330_store/gplx/DataRdr_.java +++ b/100_core/src_330_store/gplx/DataRdr_.java @@ -43,7 +43,7 @@ class DataRdr_null implements DataRdr { public double ReadDouble(String key) {return Double_.NaN;} public double ReadDoubleOr(String key, double or) {return or;} public float ReadFloat(String key) {return Float_.NaN;} public float ReadFloatOr(String key, float or) {return or;} public byte ReadByte(String key) {return Byte_.Min_value;} public byte ReadByteOr(String key, byte or) {return or;} - public DecimalAdp ReadDecimal(String key) {return DecimalAdp_.Zero;}public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) {return or;} + public Decimal_adp ReadDecimal(String key) {return Decimal_adp_.Zero;}public Decimal_adp ReadDecimalOr(String key, Decimal_adp or) {return or;} public DateAdp ReadDate(String key) {return DateAdp_.MinValue;} public DateAdp ReadDateOr(String key, DateAdp or) {return or;} public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Noop;} public boolean MoveNextPeer() {return false;} @@ -57,7 +57,7 @@ class DataRdr_null implements DataRdr { public long SrlLongOr(String key, long or) {return or;} public String SrlStrOr(String key, String or) {return or;} public DateAdp SrlDateOr(String key, DateAdp or) {return or;} - public DecimalAdp SrlDecimalOr(String key, DecimalAdp or) {return or;} + public Decimal_adp SrlDecimalOr(String key, Decimal_adp or) {return or;} public double SrlDoubleOr(String key, double or) {return or;} public Object SrlObjOr(String key, Object or) {return or;} public void SrlList(String key, List_adp list, SrlObj proto, String itmKey) {} diff --git a/100_core/src_330_store/gplx/DataWtr_.java b/100_core/src_330_store/gplx/DataWtr_.java index 55ec0d214..d0611ad65 100644 --- a/100_core/src_330_store/gplx/DataWtr_.java +++ b/100_core/src_330_store/gplx/DataWtr_.java @@ -39,7 +39,7 @@ class DataWtr_null implements DataWtr { public long SrlLongOr(String key, long or) {return or;} public String SrlStrOr(String key, String or) {return or;} public DateAdp SrlDateOr(String key, DateAdp or) {return or;} - public DecimalAdp SrlDecimalOr(String key, DecimalAdp or) {return or;} + public Decimal_adp SrlDecimalOr(String key, Decimal_adp or) {return or;} public double SrlDoubleOr(String key, double or) {return or;} public Object SrlObjOr(String key, Object or) {return or;} public void SrlList(String key, List_adp list, SrlObj proto, String itmKey) {} diff --git a/100_core/src_330_store/gplx/DataWtr_base.java b/100_core/src_330_store/gplx/DataWtr_base.java index b95d0630a..17112e3b6 100644 --- a/100_core/src_330_store/gplx/DataWtr_base.java +++ b/100_core/src_330_store/gplx/DataWtr_base.java @@ -44,7 +44,7 @@ public abstract class DataWtr_base implements SrlMgr { public long SrlLongOr(String key, long or) {WriteData(key, or); return or;} public String SrlStrOr(String key, String or) {WriteData(key, or); return or;} public DateAdp SrlDateOr(String key, DateAdp or) {WriteData(key, or.XtoStr_gplx()); return or;} - public DecimalAdp SrlDecimalOr(String key, DecimalAdp or) {WriteData(key, or.Xto_decimal()); return or;} + public Decimal_adp SrlDecimalOr(String key, Decimal_adp or) {WriteData(key, or.Under()); return or;} public double SrlDoubleOr(String key, double or) {WriteData(key, or); return or;} public Object SrlObjOr(String key, Object or) {throw Err_.new_unimplemented();} public void TypeKey_(String v) {} diff --git a/100_core/src_330_store/gplx/SrlMgr.java b/100_core/src_330_store/gplx/SrlMgr.java index 545cfb4bd..d7a46aa49 100644 --- a/100_core/src_330_store/gplx/SrlMgr.java +++ b/100_core/src_330_store/gplx/SrlMgr.java @@ -26,7 +26,7 @@ public interface SrlMgr { long SrlLongOr(String key, long v); String SrlStrOr(String key, String v); double SrlDoubleOr(String key, double v); - DecimalAdp SrlDecimalOr(String key, DecimalAdp v); + Decimal_adp SrlDecimalOr(String key, Decimal_adp v); DateAdp SrlDateOr(String key, DateAdp v); Object SrlObjOr(String key, Object v); void SrlList(String key, List_adp list, SrlObj proto, String itmKey); diff --git a/100_core/src_330_store/gplx/stores/DataRdr_base.java b/100_core/src_330_store/gplx/stores/DataRdr_base.java index 52ae2305c..3cd259dc0 100644 --- a/100_core/src_330_store/gplx/stores/DataRdr_base.java +++ b/100_core/src_330_store/gplx/stores/DataRdr_base.java @@ -131,27 +131,27 @@ public abstract class DataRdr_base implements SrlMgr { try {return (parse) ? DateAdp_.parse_gplx(String_.as_(val)) : (DateAdp)val;} catch (Exception exc) {throw Err_dataRdr_ReadFailed_err(DateAdp.class, key, val, exc);} } - @gplx.Virtual public DecimalAdp ReadDecimal(String key) { + @gplx.Virtual public Decimal_adp ReadDecimal(String key) { Object val = Read(key); try { - if (parse) return DecimalAdp_.parse_(String_.as_(val)); - DecimalAdp rv = DecimalAdp_.as_(val); + if (parse) return Decimal_adp_.parse_(String_.as_(val)); + Decimal_adp rv = Decimal_adp_.as_(val); return (rv == null) - ? DecimalAdp_.db_(val) // HACK: GfoNde_.rdr_ will call ReadAt(int i) on Db_data_rdr; since no Db_data_rdr knows about DecimalAdp, it will always return decimalType + ? Decimal_adp_.db_(val) // HACK: GfoNde_.rdr_ will call ReadAt(int i) on Db_data_rdr; since no Db_data_rdr knows about Decimal_adp, it will always return decimalType : rv; } - catch (Exception exc) {throw Err_dataRdr_ReadFailed_err(DecimalAdp.class, key, val, exc);} + catch (Exception exc) {throw Err_dataRdr_ReadFailed_err(Decimal_adp.class, key, val, exc);} } - @gplx.Virtual public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) { + @gplx.Virtual public Decimal_adp ReadDecimalOr(String key, Decimal_adp or) { Object val = Read(key); if (val == null) return or; try { - if (parse) return DecimalAdp_.parse_(String_.as_(val)); - DecimalAdp rv = DecimalAdp_.as_(val); + if (parse) return Decimal_adp_.parse_(String_.as_(val)); + Decimal_adp rv = Decimal_adp_.as_(val); return (rv == null) - ? DecimalAdp_.db_(val) // HACK: GfoNde_.rdr_ will call ReadAt(int i) on Db_data_rdr; since no Db_data_rdr knows about DecimalAdp, it will always return decimalType + ? Decimal_adp_.db_(val) // HACK: GfoNde_.rdr_ will call ReadAt(int i) on Db_data_rdr; since no Db_data_rdr knows about Decimal_adp, it will always return decimalType : rv; } - catch (Exception exc) {throw Err_dataRdr_ReadFailed_err(DecimalAdp.class, key, val, exc);} + catch (Exception exc) {throw Err_dataRdr_ReadFailed_err(Decimal_adp.class, key, val, exc);} } public char ReadChar(String key) { Object val = Read(key); @@ -186,7 +186,7 @@ public abstract class DataRdr_base implements SrlMgr { public long SrlLongOr(String key, long or) {return ReadLongOr(key, or);} public String SrlStrOr(String key, String or) {return ReadStrOr(key, or);} public DateAdp SrlDateOr(String key, DateAdp or) {return ReadDateOr(key, or);} - public DecimalAdp SrlDecimalOr(String key, DecimalAdp or) {return ReadDecimalOr(key, or);} + public Decimal_adp SrlDecimalOr(String key, Decimal_adp or) {return ReadDecimalOr(key, or);} public double SrlDoubleOr(String key, double or) {return ReadDoubleOr(key, or);} public Object SrlObjOr(String key, Object or) {throw Err_.new_unimplemented();} public void XtoStr_gfml(String_bldr sb) { diff --git a/100_core/src_800_tst/gplx/Tfds.java b/100_core/src_800_tst/gplx/Tfds.java index c1786c6ea..48b606e56 100644 --- a/100_core/src_800_tst/gplx/Tfds.java +++ b/100_core/src_800_tst/gplx/Tfds.java @@ -19,11 +19,13 @@ package gplx; import gplx.core.strings.*; import gplx.core.consoles.*; public class Tfds { // URL:doc/gplx.tfds/Tfds.txt public static boolean SkipDb = false; - public static void Eq_bool (boolean expd , boolean actl, String fmt, Object... args) {Eq_str(Bool_.Xto_str_lower(expd), Bool_.Xto_str_lower(actl), fmt, args);} - public static void Eq_str (byte[] expd, String actl, String fmt, Object... args) {Eq_str(String_.new_u8(expd), actl, fmt, args);} - public static void Eq_str (byte[] expd, byte[] actl, String fmt, Object... args) {Eq_str(String_.new_u8(expd), String_.new_u8(actl), fmt, args);} - public static void Eq_str (String expd, byte[] actl, String fmt, Object... args) {Eq_str(expd, String_.new_u8(actl), fmt, args);} - public static void Eq_str (String expd, String actl, String fmt, Object... args) {Eq_wkr(expd, actl, true, String_.Format(fmt, args));} + public static void Eq_bool (boolean expd , boolean actl, String fmt, Object... args) {Eq_exec_y(expd, actl, fmt, args);} + public static void Eq_byte (byte expd , byte actl, String fmt, Object... args) {Eq_exec_y(expd, actl, fmt, args);} + public static void Eq_int (int expd , int actl, String fmt, Object... args) {Eq_exec_y(expd, actl, fmt, args);} + public static void Eq_str (byte[] expd, byte[] actl, String fmt, Object... args) {Eq_exec_y(String_.new_u8(expd), String_.new_u8(actl), fmt, args);} + public static void Eq_str (byte[] expd, String actl, String fmt, Object... args) {Eq_exec_y(String_.new_u8(expd), actl, fmt, args);} + public static void Eq_str (String expd, byte[] actl, String fmt, Object... args) {Eq_exec_y(expd, String_.new_u8(actl), fmt, args);} + public static void Eq_str (String expd, String actl, String fmt, Object... args) {Eq_exec_y(expd, actl, fmt, args);} public static void Eq(Object expd, Object actl) {Eq_wkr(expd, actl, true, EmptyStr);} public static void Eq_able(EqAble expd, EqAble actl) {Eq_able_wkr(expd, actl, true, EmptyStr);} @@ -31,7 +33,7 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt public static void Eq_byte(byte expd, byte actl) {Eq_wkr(expd, actl, true, EmptyStr);} public static void Eq_long(long expd, long actl) {Eq_wkr(expd, actl, true, EmptyStr);} public static void Eq_float(float expd, float actl) {Eq_wkr(expd, actl, true, EmptyStr);} - public static void Eq_decimal(DecimalAdp expd, DecimalAdp actl) {Eq_wkr(expd.Xto_double(), actl.Xto_double(), true, EmptyStr);} + public static void Eq_decimal(Decimal_adp expd, Decimal_adp actl) {Eq_wkr(expd.To_double(), actl.To_double(), true, EmptyStr);} public static void Eq_date(DateAdp expd, DateAdp actl) {Eq_wkr(expd.XtoStr_gplx(), actl.XtoStr_gplx(), true, EmptyStr);} public static void Eq_date(DateAdp expd, DateAdp actl, String fmt, Object... args){Eq_wkr(expd.XtoStr_gplx(), actl.XtoStr_gplx(), true, String_.Format(fmt, args));} public static void Eq_url(Io_url expd, Io_url actl) {Eq_wkr(expd.Raw(), actl.Raw(), true, EmptyStr);} @@ -66,6 +68,11 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt public static void Eq_ary_str(Object lhs, Object rhs) {Eq_ary_wkr(lhs, rhs, false, EmptyStr);} public static void Eq_list(List_adp lhs, List_adp rhs) {Eq_list_wkr(lhs, rhs, TfdsEqListItmStr_cls_default._, EmptyStr);} public static void Eq_list(List_adp lhs, List_adp rhs, TfdsEqListItmStr xtoStr) {Eq_list_wkr(lhs, rhs, xtoStr, EmptyStr);} + private static void Eq_exec_y(Object lhs, Object rhs, String fmt, Object[] args) { + if (Object_.Eq(lhs, rhs)) return; + String msg = msgBldr.Eq_xtoStr(lhs, rhs, String_.Format(fmt, args)); + throw Err_.new_wo_type(msg); + } static void Eq_able_wkr(EqAble lhs, EqAble rhs, boolean expd, String customMsg) { boolean actl = false; if (lhs == null && rhs != null) actl = false; @@ -156,7 +163,6 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt private static final DateAdp time0 = DateAdp_.parse_gplx("2001-01-01 00:00:00.000"); private static DateAdp nowTime; // NOTE: cannot set to time0 due to static initialization; public static void WriteText(String text) {Console_adp__sys.I.Write_str(text);} - public static void Write_bry(byte[] ary) {Write(String_.new_u8(ary));} public static void Write() {Write("tmp");} public static void Write(Object... ary) { String_bldr sb = String_bldr_.new_(); diff --git a/140_dbs/src/gplx/dbs/Db_stmt.java b/140_dbs/src/gplx/dbs/Db_stmt.java index 735d5475a..e58e350c3 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt.java +++ b/140_dbs/src/gplx/dbs/Db_stmt.java @@ -36,9 +36,9 @@ public interface Db_stmt extends RlsAble { Db_stmt Crt_double(String k, double v); Db_stmt Val_double(String k, double v); Db_stmt Val_double(double v); - Db_stmt Crt_decimal(String k, DecimalAdp v); - Db_stmt Val_decimal(String k, DecimalAdp v); - Db_stmt Val_decimal(DecimalAdp v); + Db_stmt Crt_decimal(String k, Decimal_adp v); + Db_stmt Val_decimal(String k, Decimal_adp v); + Db_stmt Val_decimal(Decimal_adp v); Db_stmt Crt_bry(String k, byte[] v); Db_stmt Val_bry(String k, byte[] v); Db_stmt Val_bry(byte[] v); diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java index 504012f30..bde950e5c 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java @@ -72,10 +72,10 @@ public class Db_stmt__mem implements Db_stmt { try {Add(k, where, v);} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to add value", "type", "double", "val", v);} return this; } - public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} - public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} - public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, Key_na, v);} - private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { + public Db_stmt Crt_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(Decimal_adp v) {return Add_decimal(Bool_.N, Key_na, v);} + private Db_stmt Add_decimal(boolean where, String k, Decimal_adp v) { try {Add(k, where, v);} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v);} return this; } diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java index 81067da03..1be0ce7ed 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -94,11 +94,11 @@ class Sqlite_rdr extends Db_data_rdr { @Override public float ReadFloat(String Double d = ((Double)val); return val == null ? or : d.floatValue(); } - @Override public DecimalAdp ReadDecimal(String key) {return ReadDecimalOr(key, null);} - @Override public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) { + @Override public Decimal_adp ReadDecimal(String key) {return ReadDecimalOr(key, null);} + @Override public Decimal_adp ReadDecimalOr(String key, Decimal_adp or) { Object val = Read(key); Double d = ((Double)val); - return val == null ? or : DecimalAdp_.double_(d); + return val == null ? or : Decimal_adp_.double_(d); } @Override public DateAdp ReadDate(String key) {return ReadDateOr(key, null);} @Override public DateAdp ReadDateOr(String key, DateAdp or) { diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java index aea2942fb..c4de402af 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java @@ -70,14 +70,14 @@ public class Meta_parser__fld { , Meta_fld_wkr__default.I ); private static Btrie_slim_mgr fld_trie_init(Meta_fld_wkr__base... wkrs) { - Btrie_slim_mgr rv = Btrie_slim_mgr.ci_ascii_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); for (Meta_fld_wkr__base wkr : wkrs) wkr.Reg(rv); return rv; } private static final Btrie_slim_mgr type_trie = type_trie_init(); private static Btrie_slim_mgr type_trie_init() { - Btrie_slim_mgr rv = Btrie_slim_mgr.ci_ascii_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_byte , Sqlite_tid.Tid_int , 0, "tinyint", "int2"); Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_short , Sqlite_tid.Tid_int , 0, "smallint"); Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_int , Sqlite_tid.Tid_int , 0, "int", "integer", "mediumint"); diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java index 9a8438cbb..1f2e68d4d 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java @@ -22,7 +22,7 @@ public class Meta_parser__tbl { private final Meta_parser__fld fld_parser = new Meta_parser__fld(); private Meta_tbl_itm tbl; public Meta_tbl_itm Parse(byte[] src) { - src = Bry_.Lower_ascii(src); + src = Bry_.Lcase__all(src); rdr.Init(src); tbl = null; Parse_hdr(); diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_arg_owner.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_arg_owner.java index 6f286ab4b..0e32abbf3 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_arg_owner.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_arg_owner.java @@ -25,7 +25,7 @@ public interface Db_qry_arg_owner extends Db_qry { Db_qry_arg_owner Arg_(String k, String v); Db_qry_arg_owner Arg_(String k, byte[] v); Db_qry_arg_owner Arg_(String k, DateAdp v); - Db_qry_arg_owner Arg_(String k, DecimalAdp v); + Db_qry_arg_owner Arg_(String k, Decimal_adp v); Db_qry_arg_owner Arg_byte_(String k, byte v); Db_qry_arg_owner Arg_bry_(String k, byte[] v); Db_qry_arg_owner Arg_obj_(String key, Object val); diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java index 7c82d45a9..ad565c1cd 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java @@ -27,7 +27,7 @@ public class Db_qry_insert implements Db_qry_arg_owner { public String[] Cols_for_insert() {return cols_for_insert;} private String[] cols_for_insert; public Db_qry_arg_owner From_(String tbl) {base_table = tbl; return this;} public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); - public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);} + public Db_qry_arg_owner Arg_(String k, Decimal_adp v) {return Arg_obj_type_(k, v.Under(), Db_val_type.Tid_decimal);} public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);} public Db_qry_arg_owner Arg_byte_(String k, byte v) {return Arg_obj_type_(k, v, Db_val_type.Tid_byte);} public Db_qry_arg_owner Arg_(String k, int v) {return Arg_obj_type_(k, v, Db_val_type.Tid_int32);} diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java index b2827e2ef..71cc514cf 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java @@ -71,8 +71,8 @@ public class Db_qry_sql implements Db_qry { bfr.Add_byte(Byte_.cast_(val)); else if (ClassAdp_.Eq(val_type, DateAdp_.Cls_ref_type)) bfr.Add_byte_apos().Add_str(DateAdp_.cast_(val).XtoStr_gplx_long()).Add_byte_apos(); - else if (ClassAdp_.Eq(val_type, DecimalAdp_.Cls_ref_type)) - bfr.Add_str(DecimalAdp_.cast_(val).Xto_str()); + else if (ClassAdp_.Eq(val_type, Decimal_adp_.Cls_ref_type)) + bfr.Add_str(Decimal_adp_.cast_(val).To_str()); else { byte[] val_bry = Bry_.new_u8(Object_.Xto_str_strict_or_null(val)); val_bry = Bry_.Replace(val_bry, Byte_ascii.Apos_bry, Bry_escape_apos); diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_sql_tst.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_sql_tst.java index 07fa91f55..a43631cd7 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_sql_tst.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_sql_tst.java @@ -22,7 +22,7 @@ public class Db_qry_sql_tst { @Test public void Insert() { fxt.Test_qry ( Db_qry_insert.new_("tbl", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9") - , Object_.Ary(123, Bool_.Y, 1.23d, 123L, 123f, Byte_ascii.Num_1, "123", DateAdp_.parse_iso8561("1981-04-05T14:30:30"), DecimalAdp_.parse_("1.23")) + , Object_.Ary(123, Bool_.Y, 1.23d, 123L, 123f, Byte_ascii.Num_1, "123", DateAdp_.parse_iso8561("1981-04-05T14:30:30"), Decimal_adp_.parse_("1.23")) , "INSERT INTO tbl (k1, k2, k3, k4, k5, k6, k7, k8, k9) VALUES (123, 1, 1.23, 123, 123, 1, '123', '1981-04-05 14:30:30.000', 1.23)" ); } diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java index d3b549717..9758d9fcb 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java @@ -27,7 +27,7 @@ public class Db_qry_update implements Db_qry_arg_owner { public Criteria Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = crt; return this;} private Criteria where; public Db_qry_arg_owner From_(String tbl) {base_table = tbl; return this;} public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); - public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);} + public Db_qry_arg_owner Arg_(String k, Decimal_adp v) {return Arg_obj_type_(k, v.Under(), Db_val_type.Tid_decimal);} public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);} public Db_qry_arg_owner Arg_byte_(String k, byte v) {return Arg_obj_type_(k, v, Db_val_type.Tid_byte);} public Db_qry_arg_owner Arg_(String k, int v) {return Arg_obj_type_(k, v, Db_val_type.Tid_int32);} diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java index 77fcfea63..70528d479 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java @@ -77,12 +77,12 @@ public class Db_stmt_cmd implements Db_stmt { try {stmt.setDouble(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "double", "val", v, "sql", sql);} return this; } - public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} - public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} - public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, Key_na, v);} - private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { + public Db_stmt Crt_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(Decimal_adp v) {return Add_decimal(Bool_.N, Key_na, v);} + private Db_stmt Add_decimal(boolean where, String k, Decimal_adp v) { if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions - try {stmt.setBigDecimal(++val_idx, v.Xto_decimal());} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v, "sql", sql);} + try {stmt.setBigDecimal(++val_idx, v.Under_as_native());} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v, "sql", sql);} return this; } public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);} diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java index 533e1e6b1..2debdb54a 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java @@ -64,11 +64,11 @@ public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statemen try {Add(k, Double_.Xto_str(v));} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to add value", "type", "double", "val", v);} return this; } - public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} - public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} - public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, Key_na, v);} - private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { - try {Add(k, v.Xto_str());} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v);} + public Db_stmt Crt_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(Decimal_adp v) {return Add_decimal(Bool_.N, Key_na, v);} + private Db_stmt Add_decimal(boolean where, String k, Decimal_adp v) { + try {Add(k, v.To_str());} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v);} return this; } public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);} diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java index fe8f70926..c8bef1844 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java @@ -164,9 +164,9 @@ public class Sql_qry_wtr_ansi implements Sql_qry_wtr { sb.Add(Object_.Xto_str_strict_or_null(val)); else if (val_type == DateAdp.class) Bld_val_date(sb, arg, (DateAdp)val); - else if (val_type == DecimalAdp.class) { - DecimalAdp valDecimal = (DecimalAdp)val; - sb.Add(valDecimal.Xto_str()); + else if (val_type == Decimal_adp.class) { + Decimal_adp valDecimal = (Decimal_adp)val; + sb.Add(valDecimal.To_str()); } else { String valString = Object_.Xto_str_strict_or_null(val); diff --git a/140_dbs/src/gplx/stores/Db_data_rdr.java b/140_dbs/src/gplx/stores/Db_data_rdr.java index 55dfde419..44d6b2239 100644 --- a/140_dbs/src/gplx/stores/Db_data_rdr.java +++ b/140_dbs/src/gplx/stores/Db_data_rdr.java @@ -50,7 +50,7 @@ public class Db_data_rdr extends DataRdr_base implements DataRdr { g.setTime(ts); return DateAdp_.dateTime_(g); } - @Override public DecimalAdp ReadDecimal(String key) {return DecimalAdp_.db_(this.Read(key));} + @Override public Decimal_adp ReadDecimal(String key) {return Decimal_adp_.db_(this.Read(key));} @Override public gplx.ios.Io_stream_rdr ReadRdr(String key) { try { java.io.InputStream input_stream = rdr.getBinaryStream(key); diff --git a/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java b/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java index 1a5d5f34e..7c0441cda 100644 --- a/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java +++ b/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java @@ -67,7 +67,7 @@ class DataTypes_base_fxt { 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_.Xto_str_strict_or_empty(rdr.ReadFloat("quantity"))); - Tfds.Eq_decimal(rdr.ReadDecimal("amount"), DecimalAdp_.parts_(12, 345)); + Tfds.Eq_decimal(rdr.ReadDecimal("amount"), Decimal_adp_.parts_(12, 345)); } public void UpdateDate_hook() { conn.Exec_qry(Db_qry_.update_("dbs_multiple_data_types", Db_crt_.eq_("unique_id", 1)).Arg_obj_("last_update", DateAdpClassXtn._.XtoDb(DateAdp_.parse_gplx("20091115 220000.000")))); diff --git a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java index a3932bd81..1f3f30f20 100644 --- a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java +++ b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java @@ -229,8 +229,8 @@ public class SqliteDbMain { byte[] orig = Bry_.new_a7(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_.Xto_int_or(orig, 2, comma_pos, -1); - int orig_h = Bry_.Xto_int_or(orig, comma_pos + 1, orig.length, -1); + int orig_w = Bry_.To_int_or(orig, 2, comma_pos, -1); + int orig_h = Bry_.To_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/Gxw_html.java b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java index 8588c5264..d8d058827 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java +++ b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.gfui; import gplx.*; public interface Gxw_html extends GxwElem { void Html_doc_html_load_by_mem(String html); - void Html_doc_html_load_by_url(String path, String html); + void Html_doc_html_load_by_url(Io_url path, String html); byte Html_doc_html_load_tid(); void Html_doc_html_load_tid_(byte v); void Html_js_enabled_(boolean v); String Html_js_eval_proc_as_str (String name, Object... args); diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java index a4294e1f5..13b732bfc 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java @@ -19,7 +19,7 @@ package gplx.gfui; import gplx.*; public class Gfui_html extends GfuiElemBase { public void Under_html_(Gxw_html v) {under = v;} private Gxw_html under; public void Html_doc_html_load_by_mem(String html) {under.Html_doc_html_load_by_mem(html);} - public void Html_doc_html_load_by_url(String path, String html) {under.Html_doc_html_load_by_url(path, html);} + public void Html_doc_html_load_by_url(Io_url path, String html) {under.Html_doc_html_load_by_url(path, html);} public byte Html_doc_html_load_tid() {return under.Html_doc_html_load_tid();} public void Html_doc_html_load_tid_(byte v) {under.Html_doc_html_load_tid_(v);} public void Html_js_enabled_(boolean v) {under.Html_js_enabled_(v);} diff --git a/150_gfui/src_700_env/gplx/gfui/Mem_html.java b/150_gfui/src_700_env/gplx/gfui/Mem_html.java index e24c74471..ffe272e80 100644 --- a/150_gfui/src_700_env/gplx/gfui/Mem_html.java +++ b/150_gfui/src_700_env/gplx/gfui/Mem_html.java @@ -25,7 +25,7 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public void Html_ this.SelBgn_set(0); html_doc_html_load_tid = Gxw_html_load_tid_.Tid_mem; } - public void Html_doc_html_load_by_url(String path, String html) { + public void Html_doc_html_load_by_url(Io_url path, String html) { html_doc_html_load_tid = Gxw_html_load_tid_.Tid_url; } public byte Html_doc_html_load_tid() {return html_doc_html_load_tid;} private byte html_doc_html_load_tid; diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index 55ba35a4c..be72f94df 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -58,14 +58,17 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { @Override public Composite Under_composite() {return null;} @Override public Control Under_menu_control() {return browser;} public int Browser_tid() {return browser_tid;} private final int browser_tid; + public String Load_by_url_path() {return load_by_url_path;} private String load_by_url_path; public void Html_doc_html_load_by_mem(String html) { - html_doc_html_load_tid = Gxw_html_load_tid_.Tid_mem; + this.html_doc_html_load_tid = Gxw_html_load_tid_.Tid_mem; + this.load_by_url_path = null; browser.setText(html); // DBG: Io_mgr.I.SaveFilStr(Io_url_.new_fil_("C:\\temp.txt"), s) } - public void Html_doc_html_load_by_url(String path, String html) { - html_doc_html_load_tid = Gxw_html_load_tid_.Tid_url; + public void Html_doc_html_load_by_url(Io_url path, String html) { + this.html_doc_html_load_tid = Gxw_html_load_tid_.Tid_url; + this.load_by_url_path = path.To_http_file_str(); Io_mgr.I.SaveFilStr(path, html); - browser.setUrl(path); + browser.setUrl(path.Xto_api()); } public byte Html_doc_html_load_tid() {return html_doc_html_load_tid;} private byte html_doc_html_load_tid; public void Html_doc_html_load_tid_(byte v) {html_doc_html_load_tid = v;} @@ -183,9 +186,10 @@ class Swt_html_lnr_status implements StatusTextListener { public Swt_html_lnr_status(Swt_html html_box) {this.html_box = html_box;} private Swt_html html_box; public void Host_set(GfoEvObj host) {this.host = host;} GfoEvObj host; @Override public void changed(StatusTextEvent ev) { - if (html_box.Kit().Kit_mode__term()) - return; // shutting down raises status changed events; ignore, else SWT exception thrown; DATE:2014-05-29 + if (html_box.Kit().Kit_mode__term()) return; // shutting down raises status changed events; ignore, else SWT exception thrown; DATE:2014-05-29 String ev_text = ev.text; + String load_by_url_path = html_box.Load_by_url_path(); + if (load_by_url_path != null) ev_text = String_.Replace(ev_text, load_by_url_path, ""); // remove "C:/xowa/tab_1.html" // if (String_.Has(ev_text, "Loading [MathJax]")) return; // suppress MathJax messages; // NOTE: disabled for 2.1 (which no longer outputs messages to status); DATE:2013-05-03 try {if (host != null) GfoEvMgr_.PubObj(host, Gfui_html.Evt_link_hover, "v", ev_text);} catch (Exception e) {html_box.Kit().Ask_ok("xowa.gui.html_box", "status.fail", Err_.Message_gplx_full(e));} // NOTE: must catch error or will cause app to lock; currently called inside displaySync diff --git a/400_xowa/.classpath b/400_xowa/.classpath index f9dfc7fee..c4e9e51ba 100644 --- a/400_xowa/.classpath +++ b/400_xowa/.classpath @@ -13,7 +13,6 @@ - diff --git a/400_xowa/src/gplx/core/btries/Btrie_utf8_mgr_tst.java b/400_xowa/src/gplx/core/btries/Btrie_u8_mgr_tst.java similarity index 89% rename from 400_xowa/src/gplx/core/btries/Btrie_utf8_mgr_tst.java rename to 400_xowa/src/gplx/core/btries/Btrie_u8_mgr_tst.java index ab8912f6a..7291cb559 100644 --- a/400_xowa/src/gplx/core/btries/Btrie_utf8_mgr_tst.java +++ b/400_xowa/src/gplx/core/btries/Btrie_u8_mgr_tst.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.core.btries; import gplx.*; import gplx.core.*; import org.junit.*; import gplx.xowa.langs.cases.*; -public class Btrie_utf8_mgr_tst { - @Before public void init() {fxt.Clear();} private Btrie_utf8_mgr_fxt fxt = new Btrie_utf8_mgr_fxt(); +public class Btrie_u8_mgr_tst { + @Before public void init() {fxt.Clear();} private Btrie_u8_mgr_fxt fxt = new Btrie_u8_mgr_fxt(); @Test public void Ascii() { fxt.Init_add(Bry_.new_a7("a") , "1"); fxt.Init_add(Bry_.new_a7("abc") , "123"); @@ -47,7 +47,7 @@ public class Btrie_utf8_mgr_tst { fxt.Init_add(Bry_.new_u8("İ") , "1"); fxt.Test_match("İ" , "1"); // exact=y; İ = Bry_.ints_(196,176) fxt.Test_match("i" , "1"); // lower=y; i = Bry_.ints_(105) - fxt.Test_match("I" , null); // upper=n; I = Bry_.ints_( 73); see Btrie_utf8_itm and rv.asymmetric_bry + fxt.Test_match("I" , null); // upper=n; I = Bry_.ints_( 73); see Btrie_u8_itm and rv.asymmetric_bry fxt.Clear(); fxt.Init_add(Bry_.new_u8("i") , "1"); @@ -62,7 +62,7 @@ public class Btrie_utf8_mgr_tst { fxt.Test_match("İi" , "1"); // mixed fxt.Test_match("iİ" , "1"); // mixed } - @Test public void Utf8_asymmetric_upper() { // PURPOSE: "İ" and "I" should co-exist; see Btrie_utf8_itm and called_by_match + @Test public void Utf8_asymmetric_upper() { // PURPOSE: "İ" and "I" should co-exist; see Btrie_u8_itm and called_by_match fxt.Init_add(Bry_.new_u8("İ") , "1"); fxt.Init_add(Bry_.new_u8("I") , "1"); fxt.Test_match("İ" , "1"); // exact @@ -77,10 +77,10 @@ public class Btrie_utf8_mgr_tst { fxt.Test_match("a_b" , null); // diff : len=1 } } -class Btrie_utf8_mgr_fxt { - private Btrie_utf8_mgr trie; +class Btrie_u8_mgr_fxt { + private Btrie_u8_mgr trie; public void Clear() { - trie = Btrie_utf8_mgr.new_(Xol_case_mgr_.Utf8()); + trie = Btrie_u8_mgr.new_(Xol_case_mgr_.U8()); } public void Init_add(byte[] key, Object val) {trie.Add_obj(key, val);} public void Test_match_pos(String src_str, int bgn_pos, String expd) { 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 449bc7c49..e29a5e09b 100644 --- a/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java +++ b/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java @@ -30,10 +30,10 @@ 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_.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 int Read_int() {Move_next_simple(); return Bry_.To_int_or(data, fld_bgn, fld_end, -1);} + public byte Read_int_as_byte() {Move_next_simple(); return (byte)Bry_.To_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 double Read_double() {Move_next_simple(); return Bry_.To_double(data, fld_bgn, fld_end);} public DateAdp Read_dte() {// NOTE: fmt = yyyyMMdd HHmmss.fff int y = 0, M = 0, d = 0, H = 0, m = 0, s = 0, f = 0; if (pos < data_len && data[pos] == row_dlm) {++pos; ++row_idx; fld_idx = 0;} fld_bgn = pos; diff --git a/400_xowa/src/gplx/core/json/Json_doc.java b/400_xowa/src/gplx/core/json/Json_doc.java index 10b1892fb..b5ebfcb73 100644 --- a/400_xowa/src/gplx/core/json/Json_doc.java +++ b/400_xowa/src/gplx/core/json/Json_doc.java @@ -20,7 +20,7 @@ public class Json_doc { public void Ctor(byte[] src, Json_nde root) {this.src = src; this.root = root;} public Bry_bfr Bfr() {return bfr;} Bry_bfr bfr = Bry_bfr.new_(); public Number_parser Utl_num_parser() {return utl_num_parser;} Number_parser utl_num_parser = new Number_parser(); - public byte[] Str_utf8_bry() {return str_utf8_bry;} private byte[] str_utf8_bry = new byte[6]; + public byte[] Str_u8_bry() {return str_u8_bry;} private byte[] str_u8_bry = new byte[6]; public byte[] Src() {return src;} private byte[] src; public Json_nde Root() {return root;} Json_nde root; public byte[] Get_val_as_bry_or(byte[] qry_bry, byte[] or) {tmp_qry_bry[0] = qry_bry; return Get_val_as_bry_or(tmp_qry_bry, or);} diff --git a/400_xowa/src/gplx/core/json/Json_itm.java b/400_xowa/src/gplx/core/json/Json_itm.java index 08385d20f..2509d1961 100644 --- a/400_xowa/src/gplx/core/json/Json_itm.java +++ b/400_xowa/src/gplx/core/json/Json_itm.java @@ -47,9 +47,9 @@ class Json_itm_decimal extends Json_itm_base { @Override public byte Tid() {return Json_itm_.Tid_decimal;} @Override public Object Data() { if (data == null) - data = DecimalAdp_.parse_(String_.new_a7(this.Data_bry())); + data = Decimal_adp_.parse_(String_.new_a7(this.Data_bry())); return data; - } DecimalAdp data; + } Decimal_adp data; @Override public byte[] Data_bry() { if (data_bry == null) data_bry = Bry_.Mid(doc.Src(), this.Src_bgn(), this.Src_end()); return data_bry; @@ -82,7 +82,7 @@ class Json_itm_str extends Json_itm_base { byte[] src = doc.Src(); int bgn = this.Src_bgn(), end = this.Src_end(); if (exact) return Bry_.Mid(src, bgn, end); Bry_bfr bfr = doc.Bfr(); - byte[] utf8_bry = doc.Str_utf8_bry(); + byte[] utf8_bry = doc.Str_u8_bry(); for (int i = bgn; i < end; i++) { byte b = src[i]; switch (b) { diff --git a/400_xowa/src/gplx/core/json/Json_kv_ary_srl_tst.java b/400_xowa/src/gplx/core/json/Json_kv_ary_srl_tst.java index bf80b4d5e..2a21c99b4 100644 --- a/400_xowa/src/gplx/core/json/Json_kv_ary_srl_tst.java +++ b/400_xowa/src/gplx/core/json/Json_kv_ary_srl_tst.java @@ -23,7 +23,7 @@ public class Json_kv_ary_srl_tst { @Test public void Bool_n() {fxt.Test_parse("{'k0':false}" , fxt.ary_(fxt.kv_bool_("k0", false)));} @Test public void Num() {fxt.Test_parse("{'k0':123}" , fxt.ary_(fxt.kv_int_("k0", 123)));} @Test public void Str() {fxt.Test_parse("{'k0':'v0'}" , fxt.ary_(fxt.kv_str_("k0", "v0")));} - @Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.ary_(fxt.kv_dec_("k0", DecimalAdp_.parse_("1.23"))));} + @Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.ary_(fxt.kv_dec_("k0", Decimal_adp_.parse_("1.23"))));} @Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_(fxt.kv_int_("1", 1), fxt.kv_int_("2", 2), fxt.kv_int_("3", 3)))));} @Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_())));} @Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1,'k01':2}}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_(fxt.kv_int_("k00", 1), fxt.kv_int_("k01", 2)))));} @@ -46,5 +46,5 @@ class Json_kv_ary_srl_fxt { public KeyVal kv_str_(String key, String val) {return KeyVal_.new_(key, val);} public KeyVal kv_int_(String key, int val) {return KeyVal_.new_(key, val);} public KeyVal kv_bool_(String key, boolean val) {return KeyVal_.new_(key, Bool_.Xto_str_lower(val));} - public KeyVal kv_dec_(String key, DecimalAdp val) {return KeyVal_.new_(key, val.Xto_str());} + public KeyVal kv_dec_(String key, Decimal_adp val) {return KeyVal_.new_(key, val.To_str());} } diff --git a/400_xowa/src/gplx/xowa/net/Xoo_protocol_itm.java b/400_xowa/src/gplx/core/net/Gfo_protocol_itm.java similarity index 76% rename from 400_xowa/src/gplx/xowa/net/Xoo_protocol_itm.java rename to 400_xowa/src/gplx/core/net/Gfo_protocol_itm.java index 7bb73f8bc..22666a56e 100644 --- a/400_xowa/src/gplx/xowa/net/Xoo_protocol_itm.java +++ b/400_xowa/src/gplx/core/net/Gfo_protocol_itm.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.net; import gplx.*; import gplx.xowa.*; -public class Xoo_protocol_itm { - public Xoo_protocol_itm(byte tid, String text) { +package gplx.core.net; import gplx.*; import gplx.core.*; +public class Gfo_protocol_itm { + public Gfo_protocol_itm(byte tid, String text) { this.tid = tid; this.text_bry = Bry_.new_u8(text); this.text_str = text; @@ -68,13 +68,14 @@ public class Xoo_protocol_itm { , Tid_urn = 23 , Tid_geo = 24 , Tid_null = 25 - , Tid_xowa = 26 - , Tid_file = 27 - , Tid_relative_1 = 28 // [//a.org] - , Tid_relative_2 = 29 // [[//a.org]] + , Tid_unknown = 26 + , Tid_xowa = 27 + , Tid_file = 28 + , Tid_relative_1 = 29 // [//a.org] + , Tid_relative_2 = 30 // [[//a.org]] ; public static final Ordered_hash Regy = Ordered_hash_.new_bry_(); - public static final Xoo_protocol_itm + public static final Gfo_protocol_itm Itm_http = new_(Tid_http , "http://") , Itm_https = new_(Tid_https , "https://") , Itm_ftp = new_(Tid_ftp , "ftp://") @@ -101,28 +102,34 @@ public class Xoo_protocol_itm { , Itm_urn = new_(Tid_urn , "urn:") , Itm_geo = new_(Tid_geo , "geo:") ; - public static final String Str_file = "file:"; - public static final byte[] Bry_file = Bry_.new_a7(Str_file); - public static Xoo_protocol_itm[] Ary() { + public static final String Str_file = "file:", Str_xcmd = "xowa-cmd:"; + public static final byte[] Bry_file = Bry_.new_a7(Str_file), Bry_xcmd = Bry_.new_a7(Str_xcmd); + public static final int Len_xcmd = Bry_xcmd.length; + public static final byte[] Bry_relative = Bry_.new_a7("//"); + public static Gfo_protocol_itm Get_or(byte tid, Gfo_protocol_itm or) { + Gfo_protocol_itm[] ary = Ary(); + return tid >= ary.length ? or : ary[tid]; + } + public static Gfo_protocol_itm[] Ary() { if (protocol_itm_ary == null) { int len = Regy.Count(); - protocol_itm_ary = new Xoo_protocol_itm[len]; + protocol_itm_ary = new Gfo_protocol_itm[len]; for (int i = 0; i < len; i++) - protocol_itm_ary[i] = (Xoo_protocol_itm)Regy.Get_at(i); + protocol_itm_ary[i] = (Gfo_protocol_itm)Regy.Get_at(i); } return protocol_itm_ary; - } private static Xoo_protocol_itm[] protocol_itm_ary; + } private static Gfo_protocol_itm[] protocol_itm_ary; public static String[] Protocol_str_ary() { if (protocol_str_ary == null) { int len = Regy.Count(); protocol_str_ary = new String[len]; for (int i = 0; i < len; i++) - protocol_str_ary[i] = ((Xoo_protocol_itm)Regy.Get_at(i)).Text_str(); + protocol_str_ary[i] = ((Gfo_protocol_itm)Regy.Get_at(i)).Text_str(); } return protocol_str_ary; } private static String[] protocol_str_ary; - private static Xoo_protocol_itm new_(byte tid, String text) { - Xoo_protocol_itm rv = new Xoo_protocol_itm(tid, text); + private static Gfo_protocol_itm new_(byte tid, String text) { + Gfo_protocol_itm rv = new Gfo_protocol_itm(tid, text); Regy.Add(rv.Key_wo_colon_bry(), rv); return rv; } diff --git a/400_xowa/src_060_utl/gplx/Gfo_url_arg.java b/400_xowa/src/gplx/core/net/Gfo_qarg_itm.java similarity index 51% rename from 400_xowa/src_060_utl/gplx/Gfo_url_arg.java rename to 400_xowa/src/gplx/core/net/Gfo_qarg_itm.java index 64e63b30a..9aa590548 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_url_arg.java +++ b/400_xowa/src/gplx/core/net/Gfo_qarg_itm.java @@ -15,27 +15,37 @@ 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; -public class Gfo_url_arg { - public Gfo_url_arg(byte[] key_bry, byte[] val_bry) {this.key_bry = key_bry; this.val_bry = val_bry;} +package gplx.core.net; import gplx.*; import gplx.core.*; +public class Gfo_qarg_itm { + public Gfo_qarg_itm(byte[] key_bry, byte[] val_bry) {this.key_bry = key_bry; this.val_bry = val_bry;} public byte[] Key_bry() {return key_bry;} private byte[] key_bry; public byte[] Val_bry() {return val_bry;} private byte[] val_bry; - public Gfo_url_arg Val_bry_(byte[] v) {val_bry = v; return this;} - public static final Gfo_url_arg[] Ary_empty = new Gfo_url_arg[0]; - public static Gfo_url_arg new_key_(String key) { - return new Gfo_url_arg(Bry_.new_u8(key), Bry_.Empty); - } - public static Gfo_url_arg[] Ary(String... kvs) { + public Gfo_qarg_itm Val_bry_(byte[] v) {val_bry = v; return this;} + public static final Gfo_qarg_itm[] Ary_empty = new Gfo_qarg_itm[0]; + public static Gfo_qarg_itm new_key_(String key) {return new Gfo_qarg_itm(Bry_.new_u8(key), Bry_.Empty);} + public static Gfo_qarg_itm[] Ary(String... kvs) { int len = kvs.length; - Gfo_url_arg[] rv = new Gfo_url_arg[len / 2]; + Gfo_qarg_itm[] rv = new Gfo_qarg_itm[len / 2]; String key = null; for (int i = 0; i < len; ++i) { String s = kvs[i]; if (i % 2 == 0) key = s; else - rv[i / 2] = new Gfo_url_arg(Bry_.new_u8(key), Bry_.new_u8(s)); + rv[i / 2] = new Gfo_qarg_itm(Bry_.new_u8(key), Bry_.new_u8(s)); } return rv; } + public static String To_str(Gfo_qarg_itm[] ary) { + int len = ary.length; + Bry_bfr bfr = Bry_bfr.new_(); + for (int i = 0; i < len; ++i) { + Gfo_qarg_itm itm = ary[i]; + bfr.Add(itm.Key_bry()).Add_byte_eq(); + if (itm.Val_bry() != null) + bfr.Add(itm.Val_bry()); + bfr.Add_byte_nl(); + } + return bfr.Xto_str_and_clear(); + } } diff --git a/400_xowa/src/gplx/core/net/Gfo_qarg_mgr.java b/400_xowa/src/gplx/core/net/Gfo_qarg_mgr.java new file mode 100644 index 000000000..9cb3f02a5 --- /dev/null +++ b/400_xowa/src/gplx/core/net/Gfo_qarg_mgr.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.core.net; import gplx.*; import gplx.core.*; +public class Gfo_qarg_mgr { + private final List_adp list = List_adp_.new_(); + private final Hash_adp hash = Hash_adp_bry.cs(); + public int Len() {return list.Count();} + public boolean Match(byte[] key, byte[] val) { + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by(key); + return arg == null ? false : Bry_.Eq(val, arg.Val_bry()); + } + public Gfo_qarg_itm Get_at(int i) {return (Gfo_qarg_itm)list.Get_at(i);} + public Gfo_qarg_itm Get_arg(byte[] key) {return (Gfo_qarg_itm)hash.Get_by(key);} + public int Get_val_int_or(byte[] key, int or) { + byte[] val_bry = Get_val_bry_or(key, null); if (val_bry == null) return or; + return Bry_.To_int_or(val_bry, or); + } + public byte[] Get_val_bry_or(byte[] key, byte[] or) { + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by(key); + return arg == null ? or : arg.Val_bry(); + } + public String Get_val_str_or(byte[] key, String or) { + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by(key); + return arg == null ? or : String_.new_u8(arg.Val_bry()); + } + public void Set_val_by_int(byte[] key, int val) {Set_val_by_bry(key, Bry_.new_a7(Int_.Xto_str(val)));} + public void Set_val_by_bry(byte[] key, byte[] val) { + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by(key); + if (arg == null) { + arg = new Gfo_qarg_itm(key, Bry_.Empty); + list.Add(arg); + hash.Add(key, arg); + } + arg.Val_bry_(val); + } + public Gfo_qarg_mgr Load(Gfo_qarg_itm[] ary) { + hash.Clear(); + list.Clear(); + int len = ary.length; + for (int i = 0; i < len; ++i) { + Gfo_qarg_itm itm = ary[i]; + list.Add(itm); + hash.Add_if_dupe_use_nth(itm.Key_bry(), itm); + } + return this; + } + public Gfo_qarg_itm[] To_ary() {return (Gfo_qarg_itm[])list.To_ary(Gfo_qarg_itm.class);} + public byte[] Concat(Bry_bfr bfr, byte[]... ary) { + int ary_len = ary.length; + for (int i = 0; i < ary_len; i++) { + byte[] key = ary[i]; + Gfo_qarg_itm itm = Get_arg(key); if (itm == null) continue; + bfr.Add_byte(Byte_ascii.Amp).Add(itm.Key_bry()).Add_byte(Byte_ascii.Eq).Add(itm.Val_bry()); + } + return bfr.Xto_bry_and_clear(); + } + public byte[] To_bry() { + int len = list.Count(); if (len == 0) return Bry_.Empty; + Bry_bfr bfr = Bry_bfr.new_(); + To_bry(bfr, gplx.xowa.Xoa_app_.Utl__encoder_mgr().Href(), false); + return bfr.Xto_bry_and_clear(); + } + public void To_bry(Bry_bfr bfr, Url_encoder href_encoder, boolean encode) { + int len = list.Count(); if (len == 0) return; + for (int i = 0; i < len; ++i) { + Gfo_qarg_itm itm = (Gfo_qarg_itm)list.Get_at(i); + bfr.Add_byte(i == 0 ? Byte_ascii.Question : Byte_ascii.Amp); + Write_or_encode(bfr, href_encoder, encode, itm.Key_bry()); + bfr.Add_byte(Byte_ascii.Eq); + Write_or_encode(bfr, href_encoder, encode, itm.Val_bry()); + } + } + public static void Concat_bfr(Bry_bfr bfr, Url_encoder href_encoder, Gfo_qarg_itm[] ary) {Concat_bfr(bfr, href_encoder, ary, true);} + private static void Concat_bfr(Bry_bfr bfr, Url_encoder href_encoder, Gfo_qarg_itm[] ary, boolean encode) { + int ary_len = ary.length; + for (int i = 0; i < ary_len; i++) { + Gfo_qarg_itm itm = ary[i]; + bfr.Add_byte(i == 0 ? Byte_ascii.Question : Byte_ascii.Amp); + Write_or_encode(bfr, href_encoder, encode, itm.Key_bry()); + bfr.Add_byte(Byte_ascii.Eq); + Write_or_encode(bfr, href_encoder, encode, itm.Val_bry()); + } + } + private static void Write_or_encode(Bry_bfr bfr, Url_encoder href_encoder, boolean encode, byte[] bry) { + if (bry == null) return; // NOTE: need null check b/c itm.Val_bry can be null + if (encode) + href_encoder.Encode(bfr, bry); + else + bfr.Add(bry); + } +} diff --git a/400_xowa/src/gplx/core/net/Gfo_url.java b/400_xowa/src/gplx/core/net/Gfo_url.java new file mode 100644 index 000000000..02d1ce8a1 --- /dev/null +++ b/400_xowa/src/gplx/core/net/Gfo_url.java @@ -0,0 +1,38 @@ +/* +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.core.net; import gplx.*; import gplx.core.*; +public class Gfo_url { + public byte[] Raw() {return raw;} private byte[] raw; + public byte Protocol_tid() {return protocol_tid;} private byte protocol_tid; + public byte[] Protocol_bry() {return protocol_bry;} private byte[] protocol_bry; + public byte[] Anch() {return anch;} private byte[] anch; + public Gfo_qarg_itm[] Qargs() {return qargs;} private Gfo_qarg_itm[] qargs; + public byte[][] Segs() {return segs;} private byte[][] segs; private int segs__len; + public byte[] Segs__get_at(int i) {return i < segs__len ? segs[i] : null;} + public byte[] Segs__get_at_1st() {return segs__len > 0 ? segs[0] : null;} + public byte[] Segs__get_at_nth() {return segs__len > 1 ? segs[segs__len - 1] : null;} + public Gfo_url Ctor(byte[] raw, byte protocol_tid, byte[] protocol_bry, byte[][] segs, Gfo_qarg_itm[] qargs, byte[] anch) { + this.raw = raw; + this.protocol_tid = protocol_tid; this.protocol_bry = protocol_bry; + this.segs = segs; this.segs__len = segs.length; + this.qargs = qargs; + this.anch = anch; + return this; + } + public static final Gfo_url Empty = new Gfo_url().Ctor(Bry_.Empty, Gfo_protocol_itm.Tid_unknown, Bry_.Empty, Bry_.Ary_empty, null, null); +} diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser.java b/400_xowa/src/gplx/core/net/Gfo_url_parser.java new file mode 100644 index 000000000..4e106dfb0 --- /dev/null +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser.java @@ -0,0 +1,261 @@ +/* +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.core.net; import gplx.*; import gplx.core.*; +import gplx.core.primitives.*; import gplx.core.btries.*; +public class Gfo_url_parser { + private final Btrie_slim_mgr protocols = Btrie_slim_mgr.ci_a7(); // ASCII:url_protocol; EX:"http:", "ftp:", etc + private final Bry_ary segs_ary = new Bry_ary(4), qargs = new Bry_ary(4); + private final Url_encoder encoder = Url_encoder.new_html_href_mw_().Itms_raw_same_many(Byte_ascii.Underline); + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(500); + public byte[] Relative_url_protocol_bry() {return Gfo_protocol_itm.Itm_https.Key_w_colon_bry();} // NOTE: https b/c any WMF wiki will now default to WMF; DATE:2015-07-26 + public Gfo_url_parser() { + Init_protocols(Gfo_protocol_itm.Ary()); + Init_protocol_itm(Gfo_protocol_itm.Bry_relative, Gfo_protocol_itm.Tid_relative_1); + Init_protocol_itm(Gfo_protocol_itm.Bry_file, Gfo_protocol_itm.Tid_file); + Init_protocol_itm(gplx.xowa.parsers.lnkes.Xop_lnke_wkr.Bry_xowa_protocol, Gfo_protocol_itm.Tid_xowa); + } + private void Init_protocols(Gfo_protocol_itm... itms) { + int len = itms.length; + for (int i = 0; i < len; i++) { + Gfo_protocol_itm itm = itms[i]; + Init_protocol_itm(itm.Key_w_colon_bry(), itm.Tid()); + } + } + public void Init_protocol_itm(byte[] key, byte protocol_tid) { + protocols.Add_bry_byte(key, protocol_tid); + } + public void Parse_site_fast(Gfo_url_site_data site_data, byte[] src, int src_bgn, int src_end) { + int pos = src_bgn; boolean rel = false; + if (pos + 1 < src_end && src[pos] == Byte_ascii.Slash && src[pos + 1] == Byte_ascii.Slash) { // starts with "//" + pos += 2; + rel = true; + } + if (!rel) { // search for ":"; NOTE: only search if not rel; i.e.: "//" + int colon_pos = Bry_finder.Find_fwd(src, Byte_ascii.Colon, pos, src_end); // no colon found; EX: "//a.org/b"; "a.org/b" + if (colon_pos != Bry_.NotFound) // colon found; EX: "http://" or "https://" + pos = colon_pos + Int_.Const_dlm_len; + if (pos < src_end && src[pos] == Byte_ascii.Slash) { // skip slash after colon + pos += 1; + if (pos < src_end && src[pos] == Byte_ascii.Slash) // skip 2nd slash after colon + pos += 1; + } + } + int slash_pos = Bry_finder.Find_fwd(src, Byte_ascii.Slash, pos, src_end); + if (slash_pos == Bry_.NotFound) // no terminating slash; EX: http://a.org + slash_pos = src_end; + slash_pos = Bry_.Trim_end_pos(src, slash_pos); + site_data.Atrs_set(rel, pos, slash_pos); + } + private static final int Area__path = 1, Area__qarg_key_1st = 2, Area__qarg_key_nth = 3, Area__qarg_val = 4, Area__anch = 5; + private byte[] src; int src_bgn, src_end; + private int area; + private boolean encoded; + private byte protocol_tid; private byte[] protocol_bry, anch; + private int path_bgn, qarg_key_bgn, qarg_val_bgn, anch_bgn, anch_nth_bgn; + public Gfo_url Parse(byte[] src) {return Parse(new Gfo_url(), src, 0, src.length);} + public Gfo_url Parse(Gfo_url rv, byte[] src, int src_bgn, int src_end) { + this.src = src; this.src_bgn = src_bgn; this.src_end = src_end; + encoded = false; + protocol_tid = Gfo_protocol_itm.Tid_null; + protocol_bry = anch = null; + path_bgn = qarg_key_bgn = qarg_val_bgn = anch_bgn = anch_nth_bgn = -1; + segs_ary.Clear(); qargs.Clear(); + + int pos = src_bgn; + Object protocol_obj = protocols.Match_bgn(src, src_bgn, src_end); + pos = protocols.Match_pos(); + pos = Bry_finder.Find_fwd_while(src, pos, src_end, Byte_ascii.Slash); + if (protocol_obj == null) { + this.protocol_tid = Gfo_protocol_itm.Tid_unknown; + } + else { + this.protocol_tid = ((Byte_obj_val)protocol_obj).Val(); + this.protocol_bry = Make_bry(src_bgn, pos); + } + + area = Area__path; + path_bgn = pos; + while (true) { + if (pos == src_end) break; + byte b = src[pos]; + switch (b) { + case Byte_ascii.Slash: pos = Parse_slash(pos, b); break; + case Byte_ascii.Question: pos = Parse_qarg_key_1st(pos, b); break; + case Byte_ascii.Amp: pos = Parse_qarg_key_nth(pos, b); break; + case Byte_ascii.Eq: pos = Parse_qarg_val(pos, b); break; + case Byte_ascii.Hash: pos = Parse_anch(pos, b); break; + case Byte_ascii.Percent: encoded = true; ++pos; break; + default: + ++pos; + break; + } + } + End_area(pos, Byte_ascii.Null); + rv.Ctor(src, protocol_tid, protocol_bry, segs_ary.To_ary(0), Make_qargs(), anch); + return rv; + } + private int Parse_slash(int pos, byte b) { + switch (area) { + case Area__path: return End_area(pos, b); + default: return pos + 1; + } + } + private int Parse_anch(int pos, byte b) { + switch (area) { + case Area__path: + End_area(pos, b); + area = Area__anch; + anch_bgn = pos + 1; + break; + case Area__anch: // handle double; A#B#C -> "A#B", "C" + Append_to_last_path(Byte_ascii.Hash, Make_bry(anch_bgn, pos)); + anch_bgn = pos + 1; + break; + case Area__qarg_val: + case Area__qarg_key_1st: + case Area__qarg_key_nth: + if (anch_nth_bgn == -1) + anch_nth_bgn = Bry_finder.Find_bwd(src, Byte_ascii.Hash, src_end); + if (pos == anch_nth_bgn) { + End_area(pos, b); + area = Area__anch; + anch_bgn = pos + 1; + } + break; + default: + break; + } + return pos + 1; + } + private int Parse_qarg_key_1st(int pos, byte b) { + switch (area) { + case Area__path: // only valid way to start qarg; EX: A?B=C + End_area(pos, b); + area = Area__qarg_key_1st; + qarg_key_bgn = pos + 1; + break; + case Area__qarg_key_1st: // handle dupe; EX: A?B?C + case Area__qarg_key_nth: // handle dupe; EX: A?B=C&D? + case Area__qarg_val: // handle dupe; EX: A?B=? + End_area(pos, b); + Append_to_last_path__qargs(); + area = Area__qarg_key_1st; + qarg_key_bgn = pos + 1; + break; + } + return pos + 1; + } + private int Parse_qarg_key_nth(int pos, byte b) { + switch (area) { + case Area__path: // ignore if qarg not started; EX: A&B + break; + case Area__qarg_key_1st: // handle invalid; A?B&C + case Area__qarg_key_nth: // handle invalid; A?B=C&D&E=F + End_area(pos, b); + qargs.Add(null); + area = Area__qarg_key_nth; + qarg_key_bgn = pos + 1; + break; + case Area__qarg_val: + End_area(pos, b); + area = Area__qarg_key_nth; + qarg_key_bgn = pos + 1; + break; + } + return pos + 1; + } + private int Parse_qarg_val(int pos, byte b) { + switch (area) { + case Area__qarg_key_1st: + case Area__qarg_key_nth: + End_area(pos, b); break; + default: break; + } + return pos + 1; + } + private int End_area(int pos, byte b) { + switch (area) { + case Area__path: + segs_ary.Add(Make_bry(path_bgn, pos)); + path_bgn = pos + 1; + break; + case Area__qarg_key_1st: + case Area__qarg_key_nth: + if (b == Byte_ascii.Null && qargs.Len() == 0) // handle A?b but not A?b=c&d + Append_to_last_path(Byte_ascii.Question, Make_bry(qarg_key_bgn, src_end)); + else { + qargs.Add(Make_bry(qarg_key_bgn, pos)); + qarg_val_bgn = pos + 1; + area = Area__qarg_val; + } + break; + case Area__qarg_val: + qargs.Add(Make_bry(qarg_val_bgn, pos)); + qarg_key_bgn = pos + 1; + qarg_val_bgn = -1; + area = Area__qarg_key_nth; + break; + case Area__anch: + if (b == Byte_ascii.Null && anch_bgn == src_end) // handle A# but not "A#B" + Append_to_last_path(Byte_ascii.Hash, Make_bry(anch_bgn, src_end)); + else + anch = Make_bry(anch_bgn, pos); + break; + default: + break; + } + encoded = false; + return pos + 1; + } + private byte[] Make_bry(int bgn, int end) { + return encoded ? encoder.Decode(tmp_bfr, src, bgn, end) : Bry_.Mid(src, bgn, end); + } + private Gfo_qarg_itm[] Make_qargs() { + int qargs_len = qargs.Len(); if (qargs_len == 0) return Gfo_qarg_itm.Ary_empty; + if (qargs_len % 2 == 1) ++qargs_len; // handle odd qargs; EX: ?A=B&C&D=E + Gfo_qarg_itm[] rv = new Gfo_qarg_itm[qargs_len / 2]; + for (int i = 0; i < qargs_len; i += 2) { + byte[] key = qargs.Get_at(i); + int val_idx = i + 1; + byte[] val = val_idx < qargs_len ? qargs.Get_at(val_idx) : null; + rv[i / 2] = new Gfo_qarg_itm(key, val); + } + return rv; + } + private void Append_to_last_path(byte b, byte[] append) { + byte[] last_path = segs_ary.Get_at_last(); if (last_path == null) return; + last_path = Bry_.Add_w_dlm(b, last_path, append); + segs_ary.Set_at_last(last_path); + } + private void Append_to_last_path__qargs() { + byte[] last_path = segs_ary.Get_at_last(); if (last_path == null) return; + tmp_bfr.Add(last_path); + int len = qargs.Len(); + if (len % 2 == 1) qargs.Add(null); // handle odd qargs + for (int i = 0; i < len; i += 2) { + tmp_bfr.Add_byte(i == 0 ? Byte_ascii.Question : Byte_ascii.Amp); + tmp_bfr.Add(qargs.Get_at(i)); + byte[] qarg_val = qargs.Get_at(i + 1); + if (qarg_val != null) // handle "null" added above + tmp_bfr.Add_byte_eq().Add(qarg_val); + } + qargs.Clear(); + segs_ary.Set_at_last(tmp_bfr.Xto_bry_and_clear()); + } + public static final byte[] Bry_double_slash = new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}; +} diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java b/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java new file mode 100644 index 000000000..e3cf4b572 --- /dev/null +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.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.core.net; import gplx.*; import gplx.core.*; +class Gfo_url_parser_fxt { + private final Gfo_url_parser parser = new Gfo_url_parser(); + private Gfo_url actl; + public Gfo_url_parser_fxt Chk_protocol_tid(byte v) {Tfds.Eq_byte(v, actl.Protocol_tid(), "protocol_tid"); return this;} + public Gfo_url_parser_fxt Chk_protocol_bry(String v) {Tfds.Eq_str(v, actl.Protocol_bry(), "protocol_bry"); return this;} + public Gfo_url_parser_fxt Chk_site(String v) {Tfds.Eq_str(v, actl.Segs__get_at_1st(), "site"); return this;} + public Gfo_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl.Segs__get_at_nth(), "page"); return this;} + public Gfo_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl.Anch(), "anch"); return this;} + public Gfo_url_parser_fxt Chk_segs(String... ary) {Tfds.Eq_int(ary.length, actl.Segs().length, "segs_len"); Tfds.Eq_str_lines(String_.Concat_lines_nl(ary), String_.Concat_lines_nl(String_.Ary(actl.Segs())), "segs"); return this;} + public Gfo_url_parser_fxt Chk_qargs(String... ary) {Tfds.Eq_str_lines(String_.To_str__as_kv_ary(ary), Gfo_qarg_itm.To_str(actl.Qargs()), "qargs"); return this;} + public Gfo_url_parser_fxt Run_parse(String v) { + this.actl = parser.Parse(Bry_.new_u8(v)); + return this; + } + public void Test_Parse_site_fast(String raw, String expd) { + byte[] raw_bry = Bry_.new_u8(raw); + parser.Parse_site_fast(site_data, raw_bry, 0, raw_bry.length); + String actl = String_.new_u8(raw_bry, site_data.Site_bgn(), site_data.Site_end()); + Tfds.Eq(expd, actl); + } private final Gfo_url_site_data site_data = new Gfo_url_site_data(); +} diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java b/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java new file mode 100644 index 000000000..49bd8ee92 --- /dev/null +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java @@ -0,0 +1,124 @@ +/* +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.core.net; import gplx.*; import gplx.core.*; +import org.junit.*; +public class Gfo_url_parser_tst { + private final Gfo_url_parser_fxt tstr = new Gfo_url_parser_fxt(); + @Test public void Protocol__relative() { + tstr.Run_parse("//en.wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_relative_1).Chk_protocol_bry("//").Chk_site("en.wikipedia.org"); + } + @Test public void Protocol__none() { + tstr.Run_parse("en.wikipedia.org/wiki/A").Chk_protocol_tid(Gfo_protocol_itm.Tid_unknown).Chk_segs("en.wikipedia.org", "wiki", "A"); + } + @Test public void Site__parts__3() { + tstr.Run_parse("https://en.wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_protocol_bry("https://").Chk_segs("en.wikipedia.org"); + } + @Test public void Site__parts__2() { + tstr.Run_parse("https://wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_segs("wikipedia.org"); + } + @Test public void Site__parts__1() { + tstr.Run_parse("https://wikipedia").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_segs("wikipedia"); + } + @Test public void Site__slash__none() { + tstr.Run_parse("https:site").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_site("site"); + } + @Test public void Paths__1() { + tstr.Run_parse("https://site/A").Chk_segs("site", "A"); + } + @Test public void Paths__2() { + tstr.Run_parse("https://site/wiki/A").Chk_segs("site", "wiki", "A"); + } + @Test public void Paths__n() { + tstr.Run_parse("https://site/wiki/A/B/C/D").Chk_segs("site", "wiki", "A", "B", "C", "D"); + } + @Test public void Qargs__1() { + tstr.Run_parse("https://site/A?B=C").Chk_page("A").Chk_qargs("B", "C"); + } + @Test public void Qargs__2() { + tstr.Run_parse("https://site/A?B=C&D=E").Chk_page("A").Chk_qargs("B", "C", "D", "E"); + } + @Test public void Qargs__3() { + tstr.Run_parse("https://site/A?B=C&D=E&F=G").Chk_page("A").Chk_qargs("B", "C", "D", "E", "F", "G"); + } + @Test public void Qargs__ques__dupe__ques() { + tstr.Run_parse("https://site/A?B?Y=Z").Chk_page("A?B").Chk_qargs("Y", "Z"); + } + @Test public void Qargs__ques__dupe__amp() { + tstr.Run_parse("https://site/A?B=C&D?Y=Z").Chk_page("A?B=C&D").Chk_qargs("Y", "Z"); + } + @Test public void Qargs__ques__dupe__eq() { + tstr.Run_parse("https://site/A?B=C?Y=Z").Chk_page("A?B=C").Chk_qargs("Y", "Z"); + } + @Test public void Qargs__amp__dupe__ques() { + tstr.Run_parse("https://site/A?B&Y=Z").Chk_page("A").Chk_qargs("B", null, "Y", "Z"); + } + @Test public void Qargs__amp__dupe__amp() { + tstr.Run_parse("https://site/A?B=C&D&Y=Z").Chk_page("A").Chk_qargs("B", "C", "D", null, "Y", "Z"); + } + @Test public void Qargs__missing_val__0() { + tstr.Run_parse("https://site/A?").Chk_page("A?").Chk_qargs(); + } + @Test public void Qargs__missing_val__2() { + tstr.Run_parse("https://site/A?B=C&D&F=G").Chk_page("A").Chk_qargs("B", "C", "D", null, "F", "G"); + } + @Test public void Qargs__missing_val__n() { + tstr.Run_parse("https://site/A?B=C&D=E&F").Chk_page("A").Chk_qargs("B", "C", "D", "E", "F", null); + } + @Test public void Qargs__site_less__missing__0() { + tstr.Run_parse("A?B").Chk_segs("A?B").Chk_qargs(); + } + @Test public void Qargs__site_less() { + tstr.Run_parse("A?B=C&D=E").Chk_site("A").Chk_qargs("B", "C", "D", "E"); + } + @Test public void Anch__basic() { + tstr.Run_parse("https://site/A#B").Chk_page("A").Chk_anch("B"); + } + @Test public void Anch__repeat__2() { + tstr.Run_parse("https://site/A#B#C").Chk_page("A#B").Chk_anch("C"); + } + @Test public void Anch__repeat__3() { + tstr.Run_parse("https://site/A#B#C#D").Chk_page("A#B#C").Chk_anch("D"); + } + @Test public void Anch__missing() { + tstr.Run_parse("https://site/A#").Chk_page("A#").Chk_anch(null); + } + @Test public void Anch__missing__eos() { + tstr.Run_parse("https://site/A#B#").Chk_page("A#B#").Chk_anch(null); + } + @Test public void Anch__qargs__basic() { + tstr.Run_parse("https://site/A?B=C&D=E#F").Chk_page("A").Chk_qargs("B", "C", "D", "E").Chk_anch("F"); + } + @Test public void Anch__qargs__repeat() { + tstr.Run_parse("https://site/A?B=C#&D=E#F").Chk_page("A").Chk_qargs("B", "C#", "D", "E").Chk_anch("F"); + } + @Test public void Anch__site_less() { + tstr.Run_parse("A#B").Chk_site("A").Chk_anch("B"); + } + @Test public void Encode__page() { + tstr.Run_parse("http://site/A%27s").Chk_site("site").Chk_page("A's"); + } + @Test public void Protocol_less__qargs() { + tstr.Run_parse("Special:Search/Earth?fulltext=yes").Chk_segs("Special:Search", "Earth").Chk_page("Earth").Chk_qargs("fulltext", "yes"); + } + @Test public void Parse_site_fast() { + tstr.Test_Parse_site_fast("http://a.org/B" , "a.org"); + tstr.Test_Parse_site_fast("http://a.org" , "a.org"); + tstr.Test_Parse_site_fast("//a.org/B" , "a.org"); + tstr.Test_Parse_site_fast("//a.org/B:C" , "a.org"); + } +} diff --git a/400_xowa/src_060_utl/gplx/Gfo_url_site_data.java b/400_xowa/src/gplx/core/net/Gfo_url_site_data.java similarity index 94% rename from 400_xowa/src_060_utl/gplx/Gfo_url_site_data.java rename to 400_xowa/src/gplx/core/net/Gfo_url_site_data.java index 39feaad58..6934f27e8 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_url_site_data.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_site_data.java @@ -15,7 +15,7 @@ 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; +package gplx.core.net; import gplx.*; import gplx.core.*; public class Gfo_url_site_data { public boolean Rel() {return rel;} private boolean rel; public int Site_bgn() {return site_bgn;} private int site_bgn; diff --git a/400_xowa/src/gplx/core/net/Http_request_parser.java b/400_xowa/src/gplx/core/net/Http_request_parser.java index 080bf1dc2..9da1034a3 100644 --- a/400_xowa/src/gplx/core/net/Http_request_parser.java +++ b/400_xowa/src/gplx/core/net/Http_request_parser.java @@ -78,7 +78,7 @@ public class Http_request_parser { case Tid_x_requested_with: this.x_requested_with = Bry_.Mid(line, val_bgn, line_len); break; case Tid_cookie: this.cookie = Bry_.Mid(line, val_bgn, line_len); break; case Tid_referer: this.referer = Bry_.Mid(line, val_bgn, line_len); break; - case Tid_content_length: this.content_length = Bry_.Xto_int_or(line, val_bgn, line_len, -1); break; + case Tid_content_length: this.content_length = Bry_.To_int_or(line, val_bgn, line_len, -1); break; case Tid_content_type: Parse_content_type(val_bgn, line, line_len); break; case Tid_connection: this.connection = Bry_.Mid(line, val_bgn, line_len); break; case Tid_pragma: this.pragma = Bry_.Mid(line, val_bgn, line_len); break; @@ -146,7 +146,7 @@ public class Http_request_parser { private String To_str() {return Make_request_itm().To_str(tmp_bfr, Bool_.N);} private static final int Tid_get = 1, Tid_post = 2, Tid_host = 3, Tid_user_agent = 4, Tid_accept = 5, Tid_accept_language = 6, Tid_accept_encoding = 7, Tid_dnt = 8 , Tid_x_requested_with = 9, Tid_cookie = 10, Tid_referer = 11, Tid_content_length = 12, Tid_content_type = 13, Tid_connection = 14, Tid_pragma = 15, Tid_cache_control = 16, Tid_origin = 17; - private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_() + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7() .Add_str_int("GET" , Tid_get) .Add_str_int("POST" , Tid_post) .Add_str_int("Host:" , Tid_host) diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java index e093344e8..594ee838c 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java @@ -19,8 +19,8 @@ package gplx.gfui; import gplx.*; public class Gfui_bnd_parser { private Bry_bfr tmp_bfr = Bry_bfr.reset_(32); private Hash_adp_bry - gfui_regy = Hash_adp_bry.ci_ascii_() - , norm_regy = Hash_adp_bry.ci_ascii_() + gfui_regy = Hash_adp_bry.ci_a7() + , norm_regy = Hash_adp_bry.ci_a7() ; private static final Gfui_bnd_tkn Itm_sym_plus = new_sym_(Gfui_bnd_tkn.Tid_sym_plus , new byte[] {Byte_ascii.Plus}) @@ -106,7 +106,7 @@ public class Gfui_bnd_parser { if (tkn_bgn == -1) throw Err_.new_wo_type("invalid keycode.dot", "keycode", Bry_.Mid(src, tkn_bgn, itm_end)); ++tkn_bgn; // skip # } - int keycode = Bry_.Xto_int_or(src, tkn_bgn, itm_end, -1); if (keycode == -1) throw Err_.new_wo_type("invalid keycode", "keycode", Bry_.Mid(src, tkn_bgn, itm_end)); + int keycode = Bry_.To_int_or(src, tkn_bgn, itm_end, -1); if (keycode == -1) throw Err_.new_wo_type("invalid keycode", "keycode", Bry_.Mid(src, tkn_bgn, itm_end)); tkn = new Gfui_bnd_tkn(Gfui_bnd_tkn.Tid_key, keycode, Bry_.Empty, Bry_.Empty); } else diff --git a/400_xowa/src/gplx/html/Html_utl.java b/400_xowa/src/gplx/html/Html_utl.java index 1fda77b80..eaf563cbb 100644 --- a/400_xowa/src/gplx/html/Html_utl.java +++ b/400_xowa/src/gplx/html/Html_utl.java @@ -103,12 +103,12 @@ public class Html_utl { return dirty ? bfr.Xto_bry_and_clear() : bry; } - private static final Btrie_slim_mgr unescape_trie = Btrie_slim_mgr.ci_ascii_() - .Add_bry_bval(Html_entity_.Lt_bry , Byte_ascii.Lt) - .Add_bry_bval(Html_entity_.Gt_bry , Byte_ascii.Gt) - .Add_bry_bval(Html_entity_.Amp_bry , Byte_ascii.Amp) - .Add_bry_bval(Html_entity_.Quote_bry , Byte_ascii.Quote) - .Add_bry_bval(Html_entity_.Apos_num_bry , Byte_ascii.Apos) + private static final Btrie_slim_mgr unescape_trie = Btrie_slim_mgr.ci_a7() + .Add_bry_byte(Html_entity_.Lt_bry , Byte_ascii.Lt) + .Add_bry_byte(Html_entity_.Gt_bry , Byte_ascii.Gt) + .Add_bry_byte(Html_entity_.Amp_bry , Byte_ascii.Amp) + .Add_bry_byte(Html_entity_.Quote_bry , Byte_ascii.Quote) + .Add_bry_byte(Html_entity_.Apos_num_bry , Byte_ascii.Apos) ; public static String Unescape_as_str(String src) { Bry_bfr bfr = Bry_bfr.reset_(255); diff --git a/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java b/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java index 829cc3c71..1a4f1c4be 100644 --- a/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java +++ b/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java @@ -23,7 +23,7 @@ public class Gfo_i18n_mgr { public Gfo_i18n_mgr Add_txt_many(String key, String... ary) {return this;} } class Gfo_i18n_lng { - private Hash_adp_bry hash = Hash_adp_bry.cs_(); + private Hash_adp_bry hash = Hash_adp_bry.cs(); public Gfo_i18n_lng(String lng) {this.lng = lng;} public String Lng() {return lng;} private final String lng; public void Add(int src, byte[] key, byte[] val, boolean val_fmt_exists, Gfo_i18n_val_cmd val_cmd) { diff --git a/400_xowa/src/gplx/php/Php_itm_.java b/400_xowa/src/gplx/php/Php_itm_.java index 780dd84f3..e076bf9e6 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_.Xto_int_or(bry, -1); + rv = Bry_.To_int_or(bry, -1); return (rv == -1) ? or : rv; default: return or; diff --git a/400_xowa/src/gplx/php/Php_itm_int.java b/400_xowa/src/gplx/php/Php_itm_int.java index cdf025830..74b9bfce5 100644 --- a/400_xowa/src/gplx/php/Php_itm_int.java +++ b/400_xowa/src/gplx/php/Php_itm_int.java @@ -19,6 +19,6 @@ package gplx.php; import gplx.*; public class Php_itm_int implements Php_itm, Php_itm_sub, Php_key { public Php_itm_int(int v) {this.val_obj_int = v;} public byte Itm_tid() {return Php_itm_.Tid_int;} - public byte[] Val_obj_bry() {return Bry_.XbyInt(val_obj_int);} + public byte[] Val_obj_bry() {return Bry_.new_by_int(val_obj_int);} public int Val_obj_int() {return val_obj_int;} private int val_obj_int; } diff --git a/400_xowa/src/gplx/php/Php_parser.java b/400_xowa/src/gplx/php/Php_parser.java index bf25540c0..b93623dea 100644 --- a/400_xowa/src/gplx/php/Php_parser.java +++ b/400_xowa/src/gplx/php/Php_parser.java @@ -20,7 +20,7 @@ import gplx.core.btries.*; public class Php_parser { Php_lxr[] lxrs; int lxrs_len; int txt_bgn; Php_tkn_txt txt_tkn; - private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci:PHP tkns are ASCII + private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci:PHP tkns are ASCII byte[] src; int src_len; Php_tkn_wkr tkn_wkr; Php_tkn_factory tkn_factory = new Php_tkn_factory(); Php_ctx ctx = new Php_ctx(); Php_parser_interrupt[] parser_interrupts = new Php_parser_interrupt[256]; public Php_parser() { diff --git a/400_xowa/src/gplx/php/Php_srl_parser.java b/400_xowa/src/gplx/php/Php_srl_parser.java index a870d8e7d..2d3ce467b 100644 --- a/400_xowa/src/gplx/php/Php_srl_parser.java +++ b/400_xowa/src/gplx/php/Php_srl_parser.java @@ -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_.Xto_int_or(raw, pos, int_end, Int_.MinValue); + int int_val = Bry_.To_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_.Xto_int_or(raw, pos, int_end, Int_.MinValue); + int int_val = Bry_.To_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 2581a3f57..fae4ed013 100644 --- a/400_xowa/src/gplx/php/Php_text_itm_parser.java +++ b/400_xowa/src/gplx/php/Php_text_itm_parser.java @@ -104,7 +104,7 @@ public class Php_text_itm_parser { //throw Err_mgr._.fmt_auto_(GRP_KEY, "dollar_is_last_char", String_.new_u8(raw)); } int int_end = Find_fwd_non_int(raw, i + 1, raw_len); // +1 to search after $ - int int_val = Bry_.Xto_int_or(raw, i + 1, int_end, -1); // +1 to search after $ + int int_val = Bry_.To_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 0babc6f26..4cd6749b5 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_.Xto_int_or(src, this.Src_bgn(), this.Src_end(), Int_.MinValue);} + public int Num_val_int(byte[] src) {return Bry_.To_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 7f3389149..50ae5e193 100644 --- a/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java +++ b/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java @@ -92,14 +92,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_.Xto_int_or(src, fld_bgn, pos, -1)); + boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.To_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_.Xto_int_or(src, fld_bgn, pos, -1)); + boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.To_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 014766a76..7721afc25 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.ios.*; -import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*; +import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apps.metas.*; import gplx.xowa.apis.*; import gplx.xowa.bldrs.css.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; import gplx.xowa.urls.encoders.*; @@ -34,9 +34,11 @@ public interface Xoa_app { Xof_img_mgr File__img_mgr(); Io_download_fmt File__download_fmt(); Xoh_href_parser Html__href_parser(); + Xoh_href_wtr Html__href_wtr(); Xoh_lnki_bldr Html__lnki_bldr(); Xoa_css_extractor Html__css_installer(); Xoh_bridge_mgr Html__bridge_mgr(); + Xoa_meta_mgr Meta_mgr(); Xou_user User(); Xowmf_mgr Wmf_mgr(); boolean Xwiki_mgr__missing(byte[] domain); @@ -44,5 +46,4 @@ public interface Xoa_app { Gfo_usr_dlg Usr_dlg(); Bry_bfr_mkr Utl__bfr_mkr(); Url_encoder_mgr Utl__encoder_mgr(); - Xoa_url_parser Utl__url_parser(); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index b9d5d9d5c..d675f2777 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -26,7 +26,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "2.7.3.3"; + public static final String Version = "2.8.1.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/Xoa_url.java b/400_xowa/src/gplx/xowa/Xoa_url.java new file mode 100644 index 000000000..eced4fbfa --- /dev/null +++ b/400_xowa/src/gplx/xowa/Xoa_url.java @@ -0,0 +1,118 @@ +/* +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 gplx.core.net.*; import gplx.xowa.urls.*; +import gplx.xowa.html.hrefs.*; +public class Xoa_url { + public int Tid() {return tid;} private int tid; + public byte[] Raw() {return raw;} private byte[] raw = Bry_.Empty; + public byte[] Wiki_bry() {return wiki_bry;} public Xoa_url Wiki_bry_(byte[] v) {wiki_bry = v; return this;} private byte[] wiki_bry; + public byte[] Page_bry() {return page_bry;} public Xoa_url Page_bry_(byte[] v) {page_bry = v; return this;} private byte[] page_bry; + public byte[] Anch_bry() {return anch_bry;} public Xoa_url Anch_bry_(byte[] v) {anch_bry = v; return this;} private byte[] anch_bry; + public String Anch_str() {return anch_bry == null ? null : String_.new_u8(anch_bry);} + public byte[][] Segs_ary() {return segs_ary;} private byte[][] segs_ary; + public Gfo_qarg_itm[] Qargs_ary() {return qargs_ary;} public Xoa_url Qargs_ary_(Gfo_qarg_itm[] v) {qargs_ary = v; return this;} private Gfo_qarg_itm[] qargs_ary = Gfo_qarg_itm.Ary_empty; + public Gfo_qarg_mgr Qargs_mgr() {if (qargs_mgr == null) qargs_mgr = new Gfo_qarg_mgr().Load(qargs_ary); return qargs_mgr;} private Gfo_qarg_mgr qargs_mgr; + public byte Protocol_tid() {return protocol_tid;} private byte protocol_tid; + public byte[] Protocol_bry() {return protocol_bry;} private byte[] protocol_bry; + public boolean Protocol_is_relative() {return protocol_is_relative;} private boolean protocol_is_relative; + public byte[] Vnt_bry() {return vnt_bry;} private byte[] vnt_bry; + public boolean Wiki_is_missing() {return wiki_is_missing;} private boolean wiki_is_missing; + public boolean Wiki_is_same() {return wiki_is_same;} private boolean wiki_is_same; + public boolean Page_is_main() {return page_is_main;} private boolean page_is_main; + public Xoa_url Ctor(int tid, byte[] raw, byte protocol_tid, byte[] protocol_bry, boolean protocol_is_relative + , byte[] wiki, byte[] page, Gfo_qarg_itm[] qargs, byte[] anch + , byte[][] segs_ary, byte[] vnt_bry, boolean wiki_is_missing, boolean wiki_is_same, boolean page_is_main) { + this.tid = tid; this.raw = raw; + this.protocol_tid = protocol_tid; this.protocol_bry = protocol_bry; this.protocol_is_relative = protocol_is_relative; + this.wiki_bry = wiki; this.page_bry = page; this.qargs_ary = qargs; this.anch_bry = anch; + this.segs_ary = segs_ary; this.vnt_bry = vnt_bry; + this.wiki_is_missing = wiki_is_missing; this.wiki_is_same = wiki_is_same; this.page_is_main = page_is_main; + return this; + } + public byte[] Page_for_lnki() { + int raw_len = raw.length; + int page_bgn = Page_bgn(raw_len); + if (page_bgn == Bry_.NotFound) // no /wiki/ found; return page + return page_bry == null ? Bry_.Empty : page_bry; // guard against null ref + else + return Bry_.Mid(raw, page_bgn, raw_len);// else take everything after "/wiki/"; + } + private int Page_bgn(int raw_len) { + int wiki_pos = Bry_finder.Find_fwd(raw, Xoh_href_.Bry__wiki, 0, raw_len); // look for /wiki/ + return wiki_pos == Bry_.NotFound ? Bry_.NotFound : wiki_pos + Xoh_href_.Bry__wiki.length; + } + public boolean Eq_page(Xoa_url comp) {return Bry_.Eq(wiki_bry, comp.wiki_bry) && Bry_.Eq(page_bry, comp.page_bry) && this.Qargs_mgr().Match(Xoa_url_.Qarg__redirect, Xoa_url_.Qarg__redirect__yes) == comp.Qargs_mgr().Match(Xoa_url_.Qarg__redirect, Xoa_url_.Qarg__redirect__yes);} + public String To_str() {return String_.new_u8(To_bry(Bool_.Y, Bool_.Y));} + public byte[] To_bry_page_w_anch() { + byte[] page = page_bry, anch = anch_bry; + byte[] anch_spr = anch == null ? null : Byte_ascii.Hash_bry; + return Bry_.Add(page, anch_spr, anch); + } + public byte[] To_bry_full_wo_qargs() {return To_bry(Bool_.Y, Bool_.N);} + public byte[] To_bry(boolean full, boolean show_qargs) { // currently used for status bar; not embedded in any html + switch (tid) { + case Xoa_url_.Tid_unknown: // unknown; should not occur? + return Bry_.Len_eq_0(raw) ? Bry_.Add(wiki_bry, Byte_ascii.Slash_bry, page_bry) : raw; // raw is empty when using new_(); + case Xoa_url_.Tid_inet: // protocol; embed all; EX: "http://a.org/A"; "file:///C/dir/file.txt" + case Xoa_url_.Tid_file: // file; EX: "file:///C:/A/B.jpg" + return raw; + case Xoa_url_.Tid_xcmd: // xcmd; embed page only; EX: "xowa.usr.bookmarks.add" + return page_bry; + default: + throw Err_.new_unhandled(tid); + case Xoa_url_.Tid_anch: + case Xoa_url_.Tid_page: + break; + } + byte[] wiki = wiki_bry, page = page_bry, anch = anch_bry; + byte[] wiki_spr = vnt_bry == null ? Xoh_href_.Bry__wiki : Bry_.Add(Byte_ascii.Slash_bry, vnt_bry, Byte_ascii.Slash_bry); + byte[] anch_spr = anch == null ? null : Byte_ascii.Hash_bry; + if (!full) { + boolean tid_is_anch = tid == Xoa_url_.Tid_anch; + if ( wiki_is_same // same wiki; don't show wiki; EX: "/wiki/A" -> "A" x> "en.wikipedia.org/wiki/A" + || tid_is_anch) { // anch never shows wiki; EX: #A + wiki = wiki_spr = null; // don't show wiki; + } + if (tid_is_anch) + page = null; + } + byte[] rv = Bry_.Add + ( wiki, wiki_spr // add wiki_key; EX: "en.wikipedia.org", "/wiki/" + , page // add page; EX: "A" + , anch_spr, anch // add anch EX: "#", "B" + ); + if (show_qargs || qargs_ary.length > 0) { + Bry_bfr bfr = Xoa_app_.Utl__bfr_mkr().Get_b128(); + bfr.Add(rv); + Gfo_qarg_mgr.Concat_bfr(bfr, Xoa_app_.Utl__encoder_mgr().Href(), qargs_ary); + return bfr.To_bry_and_rls(); + } + else + return rv; + } + public static final Xoa_url Null = null; + public static Xoa_url blank() {return new Xoa_url();} + public static Xoa_url new_(byte[] wiki, byte[] page) { + Xoa_url rv = new Xoa_url(); + rv.Wiki_bry_(wiki); + rv.Page_bry_(page); + rv.tid = Xoa_url_.Tid_page; + return rv; + } Xoa_url() {} +} diff --git a/400_xowa/src/gplx/xowa/Xoa_url_.java b/400_xowa/src/gplx/xowa/Xoa_url_.java new file mode 100644 index 000000000..5455dc464 --- /dev/null +++ b/400_xowa/src/gplx/xowa/Xoa_url_.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; import gplx.*; +public class Xoa_url_ { + public static final int Tid_unknown = 0, Tid_page = 1, Tid_anch = 2, Tid_inet = 3, Tid_file = 4, Tid_xcmd = 5; + public static boolean Tid_is_pagelike(int tid) { + switch (tid) { + case Tid_page: case Tid_anch: return true; + default: return false; + } + } + public static final byte[] + Qarg__redirect = Bry_.new_a7("redirect") + , Qarg__redirect__yes = Bry_.new_a7("yes") + , Qarg__action = Bry_.new_a7("action") + , Qarg__action__edit = Bry_.new_a7("edit") + ; +} diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 863357853..7b9e6ce8b 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_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.core.threads.*; -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.apps.progs.*; +import gplx.xowa.apps.*; import gplx.xowa.apps.caches.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*; import gplx.xowa.apps.metas.*; import gplx.xowa.urls.encoders.*; import gplx.xowa.apps.progs.*; import gplx.xowa.langs.*; import gplx.xowa.specials.*; import gplx.xowa.cfgs2.*; import gplx.xowa.bldrs.css.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; @@ -37,6 +37,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { cfg_mgr = new Xoa_cfg_mgr(this); api_root = new Xoapi_root(this); user = new Xoue_user(this, user_dir); + this.meta_mgr = new Xoa_meta_mgr(this); url_cmd_eval = new Xoa_fsys_eval(fsys_mgr, user.Fsys_mgr()); fsys_mgr.Init_by_app(prog_mgr); log_wtr.Log_dir_(user.Fsys_mgr().App_temp_dir().GenSubDir("log")); @@ -45,7 +46,6 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { gui_mgr = new Xoa_gui_mgr(this); bldr = new Xob_bldr(this); file_mgr.Ctor_by_app(this); - href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), utl_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); @@ -61,21 +61,22 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { http_server = new Http_server_mgr(this); cfg_regy = new Xocfg_regy(this); html_mgr = new Xoh_html_mgr(this); - this.html__lnki_bldr = new Xoh_lnki_bldr(this, href_parser); + this.html__lnki_bldr = new Xoh_lnki_bldr(this, html__href_wtr); } public Xoa_app_type App_type() {return app_type;} private final Xoa_app_type app_type; public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr; public Xof_cache_mgr File__cache_mgr() {return file_mgr.Cache_mgr();} public Xof_img_mgr File__img_mgr() {return file_mgr.Img_mgr();} public Io_download_fmt File__download_fmt() {return wmf_mgr.Download_wkr().Download_xrg().Download_fmt();} - public Xoh_href_parser Html__href_parser() {return href_parser;} private Xoh_href_parser href_parser; + public Xoh_href_parser Html__href_parser() {return html__href_parser;} private final Xoh_href_parser html__href_parser = new Xoh_href_parser(); + public Xoh_href_wtr Html__href_wtr() {return html__href_wtr;} private final Xoh_href_wtr html__href_wtr = new Xoh_href_wtr(); public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr; public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor(); public Xoh_bridge_mgr Html__bridge_mgr() {return html__bridge_mgr;} private final Xoh_bridge_mgr html__bridge_mgr = new Xoh_bridge_mgr(); public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr(); public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();} public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();} - public Xoa_url_parser Utl__url_parser() {return utl_url_parser;} private final Xoa_url_parser utl_url_parser = new Xoa_url_parser(); + public Xoa_meta_mgr Meta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr; public boolean Bldr__running() {return bldr__running;} public void Bldr__running_(boolean v) {this.bldr__running = v;} private boolean bldr__running; public Xoae_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoae_wiki_mgr wiki_mgr; @@ -99,7 +100,6 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Xoa_shell Shell() {return shell;} private Xoa_shell shell; public Xoa_thread_mgr Thread_mgr() {return thread_mgr;} private Xoa_thread_mgr thread_mgr = new Xoa_thread_mgr(); public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr; - public Xoh_href_parser Href_parser() {return href_parser;} public Xop_sanitizer Sanitizer() {return sanitizer;} private Xop_sanitizer sanitizer; public Xop_xatr_parser Xatr_parser() {return xatr_parser;} private Xop_xatr_parser xatr_parser = new Xop_xatr_parser(); public Xop_xnde_tag_regy Xnde_tag_regy() {return xnde_tag_regy;} private Xop_xnde_tag_regy xnde_tag_regy = new Xop_xnde_tag_regy(); @@ -129,7 +129,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Xosrv_server Tcp_server() {return tcp_server;} private Xosrv_server tcp_server = new Xosrv_server(); public Http_server_mgr Http_server() {return http_server;} private Http_server_mgr http_server; - public Xop_amp_mgr Parser_amp_mgr() {return parser_amp_mgr;} private Xop_amp_mgr parser_amp_mgr = new Xop_amp_mgr(); + public Xop_amp_mgr Parser_amp_mgr() {return parser_amp_mgr;} private Xop_amp_mgr parser_amp_mgr = Xop_amp_mgr.I; private Xoa_fmtr_mgr fmtr_mgr; public Number_parser Utl_num_parser() {return utl_num_parser;} private Number_parser utl_num_parser = new Number_parser(); diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java index acbbdd08d..c80dfc3e1 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java @@ -48,6 +48,7 @@ public class Xoapi_root implements GfoInvkAble { public Xoapi_usr Usr() {return usr_api;} private final Xoapi_usr usr_api = new Xoapi_usr(); public Xoapi_special Special() {return special_api;} private final Xoapi_special special_api = new Xoapi_special(); public Xoapi_xtns Xtns() {return xtns_api;} private final Xoapi_xtns xtns_api = new Xoapi_xtns(); + public Xoapi_app_wikis Wikis() {return app_wikis;} private final Xoapi_app_wikis app_wikis = new Xoapi_app_wikis(); public String Test_str() {return test_str;} public void Test_str_(String v) {test_str = v;} private String test_str; // TEST private void Exec(String key) { Xog_cmd_itm cmd_itm = app.Gui_mgr().Cmd_mgr().Get_or_null(key); @@ -65,6 +66,7 @@ public class Xoapi_root implements GfoInvkAble { else if (ctx.Match(k, Invk_special)) return special_api; else if (ctx.Match(k, Invk_xtns)) return xtns_api; else if (ctx.Match(k, Invk_exec)) Exec(m.ReadStr("v")); + else if (ctx.Match(k, Invk_wikis)) return app_wikis; else if (ctx.Match(k, Invk_test_str)) return test_str; else if (ctx.Match(k, Invk_test_str_)) test_str = m.ReadStr("v"); return this; @@ -73,5 +75,6 @@ public class Xoapi_root implements GfoInvkAble { Invk_exec = "exec" , Invk_app = "app", Invk_bldr = "bldr", Invk_nav = "nav", Invk_gui = "gui", Invk_html = "html", Invk_net = "net", Invk_usr = "usr", Invk_special = "special", Invk_xtns = "xtns" , Invk_test_str = "test_str", Invk_test_str_ = "test_str_" + , Invk_wikis = "wikis" ; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wiki.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wiki.java new file mode 100644 index 000000000..649d0acee --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wiki.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; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; +import gplx.xowa.apis.xowa.wikis.*; +public class Xoapi_app_wiki implements GfoInvkAble { + public Xoapi_wiki_lang Lang() {return lang;} private final Xoapi_wiki_lang lang = new Xoapi_wiki_lang(); + public void Subscribe(GfoEvObj sub) {lang.Subscribe(sub);} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_lang)) return lang; + else return GfoInvkAble_.Rv_unhandled; + } + private static final String Invk_lang = "lang"; + public static final Xoapi_app_wiki Dflt = new Xoapi_app_wiki(); +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wikis.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wikis.java new file mode 100644 index 000000000..9c8177c42 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app_wikis.java @@ -0,0 +1,34 @@ +/* +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; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; +public class Xoapi_app_wikis implements GfoInvkAble { + private final Ordered_hash hash = Ordered_hash_.new_bry_(); + public Xoapi_app_wiki Get(byte[] domain) { + Xoapi_app_wiki rv = (Xoapi_app_wiki)hash.Get_by(domain); + if (rv == null) { + rv = new Xoapi_app_wiki(); + hash.Add(domain, rv); + } + return rv; + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_get)) return Get(m.ReadBry("v")); + else return GfoInvkAble_.Rv_unhandled; + } + private static final String Invk_get = "get"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_url.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_url.java index e0aef16e0..9017c1247 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_url.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_url.java @@ -26,7 +26,7 @@ public class Xoapi_url implements GfoInvkAble { public void Exec_new_tab_by_paste() {Exec_wkr(Bool_.Y, ClipboardAdp_.GetText());} public void Restore() { Xog_tab_itm tab = app.Gui_mgr().Browser_win().Active_tab(); if (tab == Xog_tab_itm_.Null) return; - this.Url_box().Text_(tab.Page().Url().Xto_full_str()); + this.Url_box().Text_(tab.Page().Url().To_str()); } private void Exec_wkr(boolean new_tab, String urls_text) { if (Op_sys.Cur().Tid_is_wnt()) diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_selection.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_selection.java index 51c95f36f..347dfd40a 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_selection.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_selection.java @@ -30,7 +30,7 @@ public class Xoapi_selection implements GfoInvkAble { if (this.Active_tab_is_null()) return; Xog_html_itm html_itm = win.Tab_mgr().Active_tab().Html_itm(); String src = html_itm.Html_selected_get_src_or_empty(); - if (String_.Len_eq_0(src)) {app.Usr_dlg().Prog_many("", "", "no file selected: tab=~{0}", html_itm.Owner_tab().Page().Url().Xto_full_str()); return;} + if (String_.Len_eq_0(src)) {app.Usr_dlg().Prog_many("", "", "no file selected: tab=~{0}", html_itm.Owner_tab().Page().Url().To_str()); return;} Io_url src_url = Io_url_.http_any_(src, Op_sys.Cur().Tid_is_wnt()); String trg_name = src_url.NameAndExt(); if (String_.Has(src, "/thumb/")) trg_name = src_url.OwnerDir().NameOnly(); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/navs/Xoapi_wiki.java b/400_xowa/src/gplx/xowa/apis/xowa/navs/Xoapi_wiki.java index 708749cb7..c639394cf 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/navs/Xoapi_wiki.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/navs/Xoapi_wiki.java @@ -27,7 +27,7 @@ public class Xoapi_wiki implements GfoInvkAble { public void Sandbox() {win.Page__navigate_by_url_bar("Project:Sandbox");} public void Main_page() { win.Tab_mgr().Active_tab_assert(); // force an active tab in case all tabs are closed; needed for win.Active_page() below; DATE:2014-09-17 - win.Page__navigate_by_url_bar(win.Active_tab().Wiki().Domain_str() + Xoh_href_parser.Href_wiki_str); // NOTE: add "/wiki/" to generate non-page like url; EX: "home" -> "home/wiki/" which will be interpreted as a url, as opposed to "home" which will be intrepretted as page; DATE:2014-04-14 + win.Page__navigate_by_url_bar(win.Active_tab().Wiki().Domain_str() + Xoh_href_.Str__wiki); // NOTE: add "/wiki/" to generate non-page like url; EX: "home" -> "home/wiki/" which will be interpreted as a url, as opposed to "home" which will be intrepretted as page; DATE:2014-04-14 } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_main_page)) this.Main_page(); 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 a3d965dae..8460588c8 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 @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.apis.xowa.usrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.gui.history.*; import gplx.xowa.gui.views.*; import gplx.xowa.users.bmks.*; +import gplx.xowa.wikis.*; public class Xoapi_bookmarks implements GfoInvkAble { private Xoae_app app; private Xog_win_itm win; public void Ctor_by_app(Xoae_app app) {this.app = app;} @@ -30,20 +31,11 @@ public class Xoapi_bookmarks implements GfoInvkAble { if (!enabled) return app.Html__bridge_mgr().Msg_bldr().To_json_str__empty(); Xoa_url url = null; if (url_str == null) { - Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return app.Html__bridge_mgr().Msg_bldr().Clear().Notify_pass_("bookmark added").To_json_str(); + Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return app.Html__bridge_mgr().Msg_bldr().Clear().Notify_pass_("bookmark added").To_json_str(); // called by http_server; return success url = tab.Page().Url(); - if (url.Wiki_bry() == null) { - url_str = "home/wiki/" + String_.new_u8(url.Page_bry()); - } - else if (url.Page_bry() == null) { - url_str = tab.Wiki().Domain_str() + "/wiki/" + String_.new_u8(url.Wiki_bry()); - } - else - url_str = String_.new_u8(url.Raw()); - url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str)); } else - url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str)); + url = app.User().Wikii().Utl__url_parser().Parse(Bry_.new_u8(url_str)); app.User().User_db_mgr().Bmk_mgr().Itms__add(Xoud_bmk_mgr.Owner_root, url); String msg = "bookmark added: " + String_.new_u8(url.Page_bry()); String rv = app.Html__bridge_mgr().Msg_bldr().Clear().Notify_pass_(msg).To_json_str(); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/wikis/Xoapi_wiki_lang.java b/400_xowa/src/gplx/xowa/apis/xowa/wikis/Xoapi_wiki_lang.java new file mode 100644 index 000000000..660bc7a58 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/wikis/Xoapi_wiki_lang.java @@ -0,0 +1,28 @@ +/* +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.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; +import gplx.xowa.apis.xowa.wikis.langs.*; +public class Xoapi_wiki_lang implements GfoInvkAble { + public Xoap_lang_variants Variants() {return variants;} private final Xoap_lang_variants variants = new Xoap_lang_variants(); + public void Subscribe(GfoEvObj sub) {variants.Subscribe(sub);} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_variants)) return variants; + else return GfoInvkAble_.Rv_unhandled; + } + private static final String Invk_variants = "variants"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/wikis/langs/Xoap_lang_variants.java b/400_xowa/src/gplx/xowa/apis/xowa/wikis/langs/Xoap_lang_variants.java new file mode 100644 index 000000000..74e016f9e --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/wikis/langs/Xoap_lang_variants.java @@ -0,0 +1,43 @@ +/* +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.wikis.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.wikis.*; +public class Xoap_lang_variants implements GfoInvkAble, GfoEvMgrOwner { + public Xoap_lang_variants() { + this.ev_mgr = GfoEvMgr.new_(this); + } + public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; + public byte[] Current() {return current;} private byte[] current; + public void Current_(byte[] v) { + this.current = v; + GfoEvMgr_.PubVal(this, Evt_current_changed, v); + } + public void Subscribe(GfoEvObj sub) { + GfoEvMgr_.SubSame(this, Evt_current_changed, sub); + if (current != null) GfoInvkAble_.InvkCmd_val(sub, Evt_current_changed, current); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_current)) return String_.new_u8(current); + else if (ctx.Match(k, Invk_current_)) Current_(m.ReadBry("v")); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String Invk_current = "current", Invk_current_ = "current_"; + public static final String + Evt_current_changed = "current_changed" + ; +} diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java b/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java index e64fd1adf..73f78317d 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_app_type.java @@ -35,7 +35,7 @@ public class Xoa_app_type { } private static final int Uid_cmd = 1, Uid_gui = 2, Uid_tcp = 3, Uid_http = 4, Uid_file = 5; private static final byte[] Key_cmd = Bry_.new_a7("cmd"), Key_gui = Bry_.new_a7("gui"), Key_tcp = Bry_.new_a7("server"), Key_http = Bry_.new_a7("http_server"), Key_file = Bry_.new_a7("file"); - private static final Hash_adp_bry type_hash = Hash_adp_bry.cs_() + private static final Hash_adp_bry type_hash = Hash_adp_bry.cs() .Add_bry_int(Key_cmd , Uid_cmd) .Add_bry_int(Key_gui , Uid_gui) .Add_bry_int(Key_http , Uid_http) 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 116995486..efaec49ee 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_wo_type("invalid gfs; num_end not found", "src", String_.new_u8(src)); bfr.Add_byte(Byte_ascii.Dollar); - int arg_idx = Bry_.Xto_int_or(src, num_bgn, num_end, -1); + int arg_idx = Bry_.To_int_or(src, num_bgn, num_end, -1); if (arg_idx == -1) { throw Err_.new_wo_type("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_.Xto_int_or(raw, i + 1, end_pos, -1); + int int_val = Bry_.To_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/apps/caches/Wdata_doc_cache.java b/400_xowa/src/gplx/xowa/apps/caches/Wdata_doc_cache.java index 6bd669045..7df1aaf6d 100644 --- a/400_xowa/src/gplx/xowa/apps/caches/Wdata_doc_cache.java +++ b/400_xowa/src/gplx/xowa/apps/caches/Wdata_doc_cache.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.apps.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.xtns.wdatas.*; public class Wdata_doc_cache { - private Hash_adp_bry hash = Hash_adp_bry.cs_(); + private Hash_adp_bry hash = Hash_adp_bry.cs(); public void Add(byte[] qid, Wdata_doc doc) {hash.Add(qid, doc);} public Wdata_doc Get_or_null(byte[] qid) {return (Wdata_doc)hash.Get_by_bry(qid);} public void Free_mem_all() {this.Clear();} diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_eval.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_eval.java index cd568b3b2..47e2b7ca8 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_eval.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_eval.java @@ -33,7 +33,7 @@ public class Xoa_fsys_eval implements Bry_fmtr_eval_mgr { } } private static final byte Tid_bin_plat_dir = 0, Tid_user_temp_dir = 1, Tid_xowa_root_dir = 2, Tid_user_cfg_dir = 3; - private static final Hash_adp_bry hash = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry hash = Hash_adp_bry.ci_a7() .Add_str_byte("bin_plat_dir" , Tid_bin_plat_dir) .Add_str_byte("user_temp_dir" , Tid_user_temp_dir) .Add_str_byte("xowa_root_dir" , Tid_xowa_root_dir) diff --git a/400_xowa/src/gplx/xowa/apps/metas/Xoa_meta_mgr.java b/400_xowa/src/gplx/xowa/apps/metas/Xoa_meta_mgr.java new file mode 100644 index 000000000..623bcfce7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/metas/Xoa_meta_mgr.java @@ -0,0 +1,24 @@ +/* +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.apps.metas; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; +public class Xoa_meta_mgr { + public Xoa_meta_mgr(Xoa_app app) { + this.ns_mgr = new Xoa_ns_mgr(app); + } + public Xoa_ns_mgr Ns_mgr() {return ns_mgr;} private final Xoa_ns_mgr ns_mgr; +} diff --git a/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java b/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java new file mode 100644 index 000000000..54f687dda --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java @@ -0,0 +1,49 @@ +/* +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.apps.metas; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; +import gplx.dbs.*; +import gplx.xowa.langs.cases.*; +import gplx.xowa.wmfs.data.*; +public class Xoa_ns_mgr { + private final Xoa_app app; + private final Hash_adp_bry hash = Hash_adp_bry.cs(); + private Xowmf_site_tbl wmf_site_tbl; private Xowmf_ns_tbl wmf_ns_tbl; + public Xoa_ns_mgr(Xoa_app app) { + this.app = app; + } + public void Add(byte[] wiki_domain, Xow_ns_mgr ns_mgr) {hash.Add(wiki_domain, ns_mgr);} // TEST: + public Xow_ns_mgr Get_or_load(byte[] wiki_domain) { + Xow_ns_mgr rv = (Xow_ns_mgr)hash.Get_by_bry(wiki_domain); + if (rv == null) { + rv = Load(wiki_domain); + Add(wiki_domain, rv); + } + return rv; + } + private Xow_ns_mgr Load(byte[] wiki_domain) { + Xow_ns_mgr rv = new Xow_ns_mgr(Xol_case_mgr_.U8()); + if (wmf_site_tbl == null) { + Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(app.Fsys_mgr().Root_dir()); + wmf_site_tbl = new Xowmf_site_tbl(conn); + wmf_ns_tbl = new Xowmf_ns_tbl(conn); + } + int site_id = wmf_site_tbl.Select_id(String_.new_u8(wiki_domain)); + wmf_ns_tbl.Select_all(rv, site_id); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index fabb8837e..f9f675227 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -173,7 +173,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo Exec_commit(-1, -1, -1, Bry_.Empty); Exec_end_hook(); Free(); - usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000")); + usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, Decimal_adp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).To_str("#,###.000")); } private void Free() { ctx.App().Free_mem(true); @@ -294,9 +294,9 @@ class Xob_rate_mgr { } private void Save(int count, long bgn, long end) { int dif = (int)(end - bgn) / 1000; - DecimalAdp rate = DecimalAdp_.divide_safe_(count, dif); + Decimal_adp rate = Decimal_adp_.divide_safe_(count, dif); save_bfr - .Add_str(rate.Xto_str("#,##0.000")).Add_byte_pipe() + .Add_str(rate.To_str("#,##0.000")).Add_byte_pipe() .Add_int_variable(count).Add_byte_pipe() .Add_int_variable(dif).Add_byte_nl() ; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java index d89581b93..755f80afd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.core.btries.*; class Uca_trie { + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); public void Init() { Init_itm(1, Bry_.ints_(1,1)); Init_itm(2, Bry_.ints_(1,1)); @@ -1043,7 +1044,7 @@ Init_itm(1021, Bry_.ints_(91,74,1,5,1,143)); Init_itm(1022, Bry_.ints_(91,72,1,5,1,143)); Init_itm(1023, Bry_.ints_(91,76,1,5,1,143)); Init_itm(1024, Bry_.ints_(92,52,1,134,143,1,143,5)); - } private Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + } public void Clear() {trie.Clear();} public void Decode(Bry_bfr tmp, byte[] src, int bgn, int end) { int i = bgn; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java index 1690876b1..101f57f51 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java @@ -27,7 +27,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); } 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_.Xto_int_or(src, fld_bgn, fld_end, -1); + if (Bry_.Eq(fld_key, Fld_cl_from)) cur_id = Bry_.To_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_.Has_at_bgn(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/cmds/ctgs/Xoctg_hiddencat_parser_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_base.java index f636038ea..a64b2556a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/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_.Xto_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_id: cur_id = Bry_.To_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/cmds/files/Xob_bin_db_itm.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_bin_db_itm.java index d71ac26b2..b5e1067fa 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_bin_db_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_bin_db_itm.java @@ -38,7 +38,7 @@ class Xob_bin_db_itm { public static Xob_bin_db_itm new_v1(Fsm_bin_fil fil) { byte[] name = Bry_.new_u8(fil.Url_rel()); // EX: "fsdb.bin.0000.sqlite3" int ns_id = 0; // assume v1 dbs are all in main ns - int pt_id = Bry_.Xto_int_or(name, 9 , 13, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); + int pt_id = Bry_.To_int_or(name, 9 , 13, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); return new Xob_bin_db_itm(fil.Id(), fil.Url(), ns_id, pt_id); } public static Xob_bin_db_itm new_v2(Fsm_bin_fil fil) { @@ -50,8 +50,8 @@ class Xob_bin_db_itm { int ns_end = Bry_finder.Find_fwd(name, ns_end_tkn, ns_bgn); if (ns_end == Bry_finder.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); int pt_bgn = ns_end + ns_end_tkn_len; int pt_end = Bry_finder.Find_fwd(name, pt_end_tkn, pt_bgn); if (pt_end == Bry_finder.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); - int ns_id = Bry_.Xto_int_or(name, ns_bgn, ns_end, Int_.MinValue); if (ns_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); - int pt_id = Bry_.Xto_int_or(name, pt_bgn, pt_end, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); + int ns_id = Bry_.To_int_or(name, ns_bgn, ns_end, Int_.MinValue); if (ns_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); + int pt_id = Bry_.To_int_or(name, pt_bgn, pt_end, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); return new Xob_bin_db_itm(fil.Id(), fil.Url(), ns_id, pt_id); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index 0a34f8e3d..f19606718 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -276,7 +276,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { if (exit_after_commit) exit_now = true; } public void Cmd_end() { - usr_dlg.Note_many("", "", "fsdb_make.done: count=~{0} rate=~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000")); + usr_dlg.Note_many("", "", "fsdb_make.done: count=~{0} rate=~{1}", exec_count, Decimal_adp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).To_str("#,###.000")); if (src_fsdb_wkr != null) { src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_end(); // NOTE: src_fsdb_wkr will be null if no src db defined } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java index 879eb3f94..5790898a4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java @@ -50,10 +50,10 @@ public class Xob_image_cmd extends Xob_itm_dump_base implements Xob_cmd, GfoInvk 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_.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_size: cur_size = Bry_.To_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_width: cur_width = Bry_.To_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_height: cur_height = Bry_.To_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_bits: cur_bits = Bry_.To_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); break; case Fld_img_timestamp: cur_timestamp = Bry_.Mid(src, fld_bgn, fld_end); diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java index 95597811b..8e32941f5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java @@ -19,6 +19,7 @@ package gplx.xowa.bldrs.css; import gplx.*; import gplx.xowa.*; import gplx.xowa import gplx.ios.*; import gplx.xowa.html.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.files.downloads.*; +import gplx.core.net.*; public class Xoa_css_extractor { public IoEngine_xrg_downloadFil Download_xrg() {return download_xrg;} private IoEngine_xrg_downloadFil download_xrg = Io_mgr.I.DownloadFil_args("", Io_url_.Empty); public Xoa_css_extractor Wiki_domain_(byte[] v) {wiki_domain = v; return this;} private byte[] wiki_domain; @@ -33,6 +34,7 @@ public class Xoa_css_extractor { public Xoa_css_extractor Url_encoder_(Url_encoder v) {url_encoder = v; return this;} private Url_encoder url_encoder; public Xoa_css_extractor Wiki_code_(byte[] v) {this.wiki_code = v; return this;} private byte[] wiki_code = null; private byte[] mainpage_html; private boolean lang_is_ltr = true; + private final Gfo_url_parser url_parser = new Gfo_url_parser(); public void Init_by_app(Xoae_app app) { this.usr_dlg = app.Usr_dlg(); Xof_download_wkr download_wkr = app.Wmf_mgr().Download_wkr(); @@ -234,6 +236,7 @@ public class Xoa_css_extractor { int prv_pos = 0; int css_find_bgn_len = Css_find_bgn.length; byte[] protocol_prefix_bry = Bry_.new_u8(protocol_prefix); + Gfo_url gfo_url = new Gfo_url(); while (true) { int url_bgn = Bry_finder.Find_fwd(raw, Css_find_bgn, prv_pos); if (url_bgn == Bry_.NotFound) break; // nothing left; stop url_bgn += css_find_bgn_len; @@ -241,7 +244,10 @@ public class Xoa_css_extractor { byte[] css_url_bry = Bry_.Mid(raw, url_bgn, url_end); css_url_bry = Bry_.Replace(css_url_bry, Css_amp_find, Css_amp_repl); // & -> & css_url_bry = url_encoder.Decode(css_url_bry); // %2C -> %7C -> | - css_url_bry = Bry_.Add(protocol_prefix_bry, css_url_bry); + url_parser.Parse(gfo_url, css_url_bry, 0, css_url_bry.length); + if ( gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_relative_1 // if rel url, add protocol_prefix DATE:2015-08-01 + || (Env_.Mode_testing() && gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_unknown)) // TEST: + css_url_bry = Bry_.Add(protocol_prefix_bry, css_url_bry); rv.Add(String_.new_u8(css_url_bry)); prv_pos = url_end; } diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_img_downloader.java b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_img_downloader.java index 30c98f25e..17d986719 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_img_downloader.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_img_downloader.java @@ -39,7 +39,7 @@ public class Xoa_css_img_downloader { int src_len = src.length; int prv_pos = 0; Bry_bfr bfr = Bry_bfr.new_(src_len); - Hash_adp img_hash = Hash_adp_bry.cs_(); + Hash_adp img_hash = Hash_adp_bry.cs(); while (true) { int url_pos = Bry_finder.Find_fwd(src, Bry_url, prv_pos); if (url_pos == Bry_.NotFound) {bfr.Add_mid(src, prv_pos, src_len); break;} // no more "url("; exit; diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xob_css_parser.java b/400_xowa/src/gplx/xowa/bldrs/css/Xob_css_parser.java index 4785cde51..dec56cb3c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xob_css_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xob_css_parser.java @@ -49,7 +49,7 @@ class Xob_css_parser { } } private static final byte Tkn_import = 1, Tkn_url = 2; - private static final Btrie_slim_mgr tkns_trie = Btrie_slim_mgr.ci_ascii_() + private static final Btrie_slim_mgr tkns_trie = Btrie_slim_mgr.ci_a7() .Add_str_byte("@import" , Tkn_import) .Add_str_byte(" url(" , Tkn_url) ; diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xob_url_fixer.java b/400_xowa/src/gplx/xowa/bldrs/css/Xob_url_fixer.java index 25ace33da..e7f209c93 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xob_url_fixer.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xob_url_fixer.java @@ -76,7 +76,7 @@ class Xob_url_fixer_tkn { private static Btrie_slim_mgr bgn_trie; public static Btrie_slim_mgr Bgn_trie() { if (bgn_trie == null) { - bgn_trie = Btrie_slim_mgr.ci_ascii_(); + bgn_trie = Btrie_slim_mgr.ci_a7(); trie_add(bgn_trie, Tid_bgn_slash_1 , "/"); trie_add(bgn_trie, Tid_bgn_slash_2 , "//"); trie_add(bgn_trie, Tid_bgn_http , "http://"); @@ -88,7 +88,7 @@ class Xob_url_fixer_tkn { private static Btrie_slim_mgr mid_trie; public static Btrie_slim_mgr Mid_trie() { if (mid_trie == null) { - mid_trie = Btrie_slim_mgr.ci_ascii_(); + mid_trie = Btrie_slim_mgr.ci_a7(); trie_add(mid_trie, Tid_mid_rel_1 , "/../"); trie_add(mid_trie, Tid_mid_rel_2 , "/./"); trie_add(mid_trie, Tid_mid_slash , "/"); diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr.java index 6ec4d0630..f5ae45a61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr.java @@ -20,7 +20,7 @@ import gplx.xowa.wikis.ttls.*; public class Xob_ttl_filter_mgr { private boolean exclude_is_empty = true, include_is_empty = true; private final Xob_ttl_filter_mgr_srl srl = new Xob_ttl_filter_mgr_srl(); - private Hash_adp_bry exclude_hash = Hash_adp_bry.cs_(), include_hash = Hash_adp_bry.cs_(); + private Hash_adp_bry exclude_hash = Hash_adp_bry.cs(), include_hash = Hash_adp_bry.cs(); public void Clear() { exclude_hash.Clear(); include_hash.Clear(); diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr_srl_tst.java b/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr_srl_tst.java index c0b3b16cf..5326cbc93 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr_srl_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/core/Xob_ttl_filter_mgr_srl_tst.java @@ -37,7 +37,7 @@ public class Xob_ttl_filter_mgr_srl_tst { } class Xob_ttl_filter_mgr_srl_fxt { private final Xob_ttl_filter_mgr_srl mgr = new Xob_ttl_filter_mgr_srl(); - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); public void Clear() { hash.Clear(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_file.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_file.java index 9ffa78c1c..13884fa4f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_file.java @@ -24,7 +24,7 @@ class Dg_file { public Dg_rule[] Lines() {return lines;} private final Dg_rule[] lines; } class Dg_rule {// EX: < wikipedia ><-30> - private final Hash_adp_bry word_idx_hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry word_idx_hash = Hash_adp_bry.cs(); public Dg_rule(int file_id, int id, int idx, int tid, byte[] key, int score, Dg_word[] words) { this.file_id = file_id; this.id = id; this.idx = idx; this.tid = tid; this.key = key; this.score = score; this.words = words; diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java index 05432dd80..4f8807b80 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.xowa.bldrs.filters.core.*; public class Dg_match_mgr { private int score_init, score_fail; private boolean log_enabled, case_match; - private final Btrie_slim_mgr btrie = Btrie_slim_mgr.cs_(); + private final Btrie_slim_mgr btrie = Btrie_slim_mgr.cs(); private final Ordered_hash rules = Ordered_hash_.new_bry_(); private final Ordered_hash rule_group_hash = Ordered_hash_.new_bry_(), rule_tally_hash = Ordered_hash_.new_bry_(); private final Dg_parser parser = new Dg_parser(); diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java index a4e8566b8..30444b026 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java @@ -71,7 +71,7 @@ class Dg_parser { if (src[brack_bgn] != Byte_ascii.Lt) {Warn("dg.invalid_line.wrong_term_dlm", rel_path, line_idx, src, line_bgn, line_end); break;} brack_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, brack_bgn); if (brack_end == Bry_finder.Not_found) {Warn("dg.invalid_line.score not found", rel_path, line_idx, src, line_bgn, line_end); break;} - int parse_score = Bry_.Xto_int_or(src, brack_bgn + 1, brack_end, Int_.MinValue); + int parse_score = Bry_.To_int_or(src, brack_bgn + 1, brack_end, Int_.MinValue); if (parse_score == Int_.MinValue) {Warn("dg.invalid_line.score is invalid", rel_path, line_idx, src, line_bgn, line_end); break;} score = parse_score; break; 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 baf67bb0f..179da862d 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 @@ -331,7 +331,7 @@ public class Xol_mw_lang_parser { , Tid_fallback = 5, Tid_rtl = 6 , Tid_separatorTransformTable = 7, Tid_digitTransformTable = 8, Tid_digitGroupingPattern = 9 ; - private static Hash_adp_bry Tid_hash = Hash_adp_bry.cs_() + private static Hash_adp_bry Tid_hash = Hash_adp_bry.cs() .Add_str_byte("namespaceNames", Tid_namespaceNames).Add_str_byte("namespaceAliases", Tid_namespaceAliases).Add_str_byte("specialPageAliases", Tid_specialPageAliases) .Add_str_byte("messages", Tid_messages).Add_str_byte("magicWords", Tid_magicwords) .Add_str_byte("fallback", Tid_fallback).Add_str_byte("rtl", Tid_rtl) @@ -340,7 +340,7 @@ public class Xol_mw_lang_parser { ; public static int Id_by_mw_name(byte[] src) { if (mw_names == null) { - mw_names = Btrie_slim_mgr.cs_(); + mw_names = Btrie_slim_mgr.cs(); mw_names.Add_obj("NS_MEDIA", Int_obj_val.new_(Xow_ns_.Id_media)); mw_names.Add_obj("NS_SPECIAL", Int_obj_val.new_(Xow_ns_.Id_special)); mw_names.Add_obj("NS_MAIN", Int_obj_val.new_(Xow_ns_.Id_main)); diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java index 201bcfea2..0e818c336 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.gfui.*; import gplx.xowa.bldrs.cmds.utils.*; public class Xob_import_marker { - private final Hash_adp_bry in_progress_hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry in_progress_hash = Hash_adp_bry.cs(); public void Bgn(Xowe_wiki wiki) { in_progress_hash.Add_as_key_and_val(wiki.Domain_bry()); Io_mgr.I.SaveFilStr(url_(wiki), "XOWA has created this file to indicate that an import is in progress. This file will be deleted once the import is completed."); 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 c7f848bb6..04933cccf 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_.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_u8(src, data_bgn, hook_bgn)); + int page_id = Bry_.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_u8(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/bldrs/xmls/Xob_xml_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java index 5ae8d13e2..ab803abcd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java @@ -22,7 +22,7 @@ public class Xob_xml_parser_tst { Io_mgr.I.InitEngine_mem(); Xoae_app app = Xoa_app_fxt.app_(); bldr = new Xob_bldr(app); - } private Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii()); + } private Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); @Test public void Basic_docs_1() { Xowd_page_itm doc = doc_(1, "a", "a a", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); diff --git a/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_grp_tid.java b/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_grp_tid.java index 0e41253da..3f3c031d9 100644 --- a/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_grp_tid.java +++ b/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_grp_tid.java @@ -43,5 +43,5 @@ public class Xoa_cfg_grp_tid { factory.Add(key, rv); } return rv; - } static Hash_adp_bry factory = Hash_adp_bry.cs_(); + } static Hash_adp_bry factory = Hash_adp_bry.cs(); } diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_data_cache.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_data_cache.java index 05a18acb6..10465c567 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_data_cache.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_data_cache.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; public class Xoctg_data_cache { - private Hash_adp_bry regy = Hash_adp_bry.cs_(); // NOTE: changed to cs from ci; cache is hashing page_ttls by ctg_name which is always ttl.Page_txt(); DATE:2014-07-07 + private Hash_adp_bry regy = Hash_adp_bry.cs(); // NOTE: changed to cs from ci; cache is hashing page_ttls by ctg_name which is always ttl.Page_txt(); DATE:2014-07-07 public Xoctg_data_ctg Get_or_null(byte[] ctg_name) {return (Xoctg_data_ctg)regy.Get_by_bry(ctg_name);} public Xoctg_data_ctg Load_or_null(Xowe_wiki wiki, byte[] ctg_name) { Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg(); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java index 61e5be82f..184335572 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java @@ -116,7 +116,7 @@ class Xoctg_fmtr_all { private void Html_nav_bry(Bry_bfr bfr, Xowe_wiki wiki, Xoa_ttl ttl, Xoctg_view_grp view_grp, boolean fill_at_bgn) { Bry_bfr href_bfr = wiki.Utl__bfr_mkr().Get_b512(); Xoae_app app = wiki.Appe(); - app.Href_parser().Build_to_bfr(href_bfr, app, wiki.Domain_bry(), ttl); + app.Html__href_wtr().Build_to_bfr(href_bfr, app, wiki.Domain_bry(), ttl); byte[] arg_idx_lbl = null; byte[] arg_sortkey = null; if (fill_at_bgn) { arg_idx_lbl = url_arg_bgn; diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java index d6ee4c428..1305207bd 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java @@ -21,7 +21,7 @@ import gplx.xowa.users.history.*; abstract class Xoctg_fmtr_itm_base implements Xoctg_fmtr_itm { public void Init_from_all(Xowe_wiki wiki, Xol_lang lang, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list, int itms_list_len) { this.wiki = wiki; this.lang = lang; this.ctg = ctg; this.list = itms_list; this.len = itms_list_len; this.msg_mgr = wiki.Msg_mgr(); - href_parser = wiki.Appe().Href_parser(); + href_parser = wiki.Appe().Html__href_parser(); html_itm = mgr.Html_itm(); html_itm_missing = mgr.Html_itm_missing(); history_mgr = wiki.Appe().Usere().History_mgr(); @@ -58,7 +58,7 @@ abstract class Xoctg_fmtr_itm_base implements Xoctg_fmtr_itm { grp_end_at_col = true; } @gplx.Virtual public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { - byte[] itm_href = href_parser.Build_to_bry(wiki, ttl); + byte[] itm_href = wiki.App().Html__href_wtr().Build_to_bry(wiki, ttl); byte[] itm_full_ttl = ttl.Full_txt();// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A" byte[] itm_atr_cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add Bry_fmtr fmtr = itm.Id_missing() ? html_itm_missing : html_itm; @@ -94,7 +94,7 @@ class Xoctg_fmtr_itm_file extends Xoctg_fmtr_itm_base { } class Xoctg_fmtr_itm_subc extends Xoctg_fmtr_itm_base { @Override public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { - byte[] itm_href = href_parser.Build_to_bry(wiki, ttl); + byte[] itm_href = wiki.App().Html__href_wtr().Build_to_bry(wiki, ttl); int sub_ctgs = itm.Subs_ctgs(); int sub_pages = itm.Subs_pages(); int sub_files = itm.Subs_files(); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java index 1a14b2126..15737f0f9 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java @@ -19,11 +19,12 @@ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.users.history.*; public class Xoctg_pagelist_itms implements Bry_fmtr_arg { + private Xoh_href_wtr href_wtr; private Xou_history_mgr history_mgr; private Bry_fmtr fmtr_itm; public void Init_app(Xoae_app app, Bry_fmtr fmtr_itm) { - this.href_parser = app.Href_parser(); + this.href_wtr = app.Html__href_wtr(); this.history_mgr = app.Usere().History_mgr(); this.fmtr_itm = fmtr_itm; - } private Xoh_href_parser href_parser; private Xou_history_mgr history_mgr; private Bry_fmtr fmtr_itm; + } public void Init_wiki(Xowe_wiki wiki) {this.wiki = wiki;} private Xowe_wiki wiki; public void Itms_clear() {itms.Clear();} private List_adp itms = List_adp_.new_(); public void Itms_add(Xowd_page_itm page) {itms.Add(page);} @@ -33,7 +34,7 @@ public class Xoctg_pagelist_itms implements Bry_fmtr_arg { Xowd_page_itm page = (Xowd_page_itm)itms.Get_at(i); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Xow_ns_.Id_category, page.Ttl_page_db()); byte[] lnki_cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add - byte[] lnki_href = href_parser.Build_to_bry(wiki, ttl); + byte[] lnki_href = href_wtr.Build_to_bry(wiki, ttl); byte[] lnki_ttl = ttl.Full_txt(); byte[] lnki_text = ttl.Page_txt(); fmtr_itm.Bld_bfr_many(bfr, lnki_cls, lnki_href, lnki_ttl, lnki_text); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_url.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_url.java index 93f1997aa..398ff5a10 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_url.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_url.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.ctgs; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; public class Xoctg_url { public byte[][] Grp_idxs() {return grp_idxs;} private byte[][] grp_idxs = new byte[3][]; public byte[] Grp_fwds() {return grp_fwds;} private byte[] grp_fwds = new byte[3]; @@ -28,10 +28,10 @@ public class Xoctg_url { } public Xoctg_url Parse(Gfo_usr_dlg usr_dlg, Xoa_url url) { this.Clear(); - Gfo_url_arg[] args = url.Args(); + Gfo_qarg_itm[] args = url.Qargs_ary(); int len = args.length; for (int i = 0; i < len; i++) { - Gfo_url_arg arg = args[i]; + Gfo_qarg_itm arg = args[i]; byte[] arg_key = arg.Key_bry(); Object tid_obj = Arg_keys.Get_by_bry(arg_key); if (tid_obj == null) {usr_dlg.Warn_many("", "", "unknown arg_key: ~{0}", String_.new_u8(arg_key)); continue;} // ignore invalid args @@ -59,7 +59,7 @@ public class Xoctg_url { } } public static final byte Tid_all_bgn = 0, Tid_subc_bgn = 1, Tid_subc_end = 2, Tid_file_bgn = 3, Tid_file_end = 4, Tid_page_bgn = 5, Tid_page_end = 6, Tid_all_end = 8; - public static final Hash_adp_bry Arg_keys = Hash_adp_bry.ci_ascii_() + public static final Hash_adp_bry Arg_keys = Hash_adp_bry.ci_a7() .Add_bry_byte(Xoctg_fmtr_all.Url_arg_from, Tid_all_bgn) .Add_bry_byte(Xoctg_fmtr_all.Url_arg_until, Tid_all_end) .Add_bry_byte(Xoctg_fmtr_all.Url_arg_subc_bgn, Tid_subc_bgn) diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_url_tst.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_url_tst.java index f37fa0536..edf14d584 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_url_tst.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_url_tst.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.ctgs; import gplx.*; import gplx.xowa.*; -import org.junit.*; +import org.junit.*; import gplx.xowa.urls.*; public class Xoctg_url_tst { @Before public void init() {fxt.Clear();} private Xoctg_url_fxt fxt = new Xoctg_url_fxt(); @Test public void Basic() { @@ -30,14 +30,15 @@ class Xoctg_url_fxt { public Xoctg_url_chkr url() {return expd.Clear();} private Xoctg_url_chkr expd; public void Clear() { if (parser == null) { - parser = new Xoa_url_parser(); - page_url = Xoa_url.blank_(); + Xoa_app app = Xoa_app_fxt.app_(); + parser = app.User().Wikii().Utl__url_parser(); + page_url = Xoa_url.blank(); ctg_url = new Xoctg_url(); expd = new Xoctg_url_chkr(); } } private Xoa_url_parser parser; Xoa_url page_url; Xoctg_url ctg_url; public void Test_parse(String url_str, Xoctg_url_chkr expd) { - parser.Parse(page_url, Bry_.new_u8(url_str)); + page_url = parser.Parse(Bry_.new_u8(url_str)); ctg_url.Parse(Gfo_usr_dlg_.Test(), page_url); expd.Chk(ctg_url); expd.Clear(); 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 e833fea48..8d21007a0 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 @@ -498,7 +498,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { if (pids_root == null) pids_root = wiki.Appe().Wiki_mgr().Wdata_mgr().Wdata_wiki().Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "pid"); Xob_xdat_itm pid_itm = Load_xdat_itm_by_dir(pids_root.GenSubDir(String_.new_u8(lang_key)), pid_name); if (pid_itm == null) return gplx.xowa.xtns.wdatas.Wdata_wiki_mgr.Pid_null; - 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 + return Bry_.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 } 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/files/Xof_ext_.java b/400_xowa/src/gplx/xowa/files/Xof_ext_.java index 9546f8cbb..c08199e80 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_ext_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_ext_.java @@ -50,7 +50,7 @@ public class Xof_ext_ { }; private static final Hash_adp id_hash = id_hash_new_(); private static Hash_adp id_hash_new_() { - Hash_adp rv = Hash_adp_bry.cs_(); + Hash_adp rv = Hash_adp_bry.cs(); id_hash_new_(rv, Bry_png, Id_png); id_hash_new_(rv, Bry_jpg, Id_jpg); id_hash_new_(rv, Bry_jpeg, Id_jpeg); id_hash_new_(rv, Bry_gif, Id_gif); id_hash_new_(rv, Bry_tif, Id_tif); id_hash_new_(rv, Bry_tiff, Id_tiff); id_hash_new_(rv, Bry_svg, Id_svg); id_hash_new_(rv, Bry_djvu, Id_djvu); id_hash_new_(rv, Bry_pdf, Id_pdf); @@ -61,7 +61,7 @@ public class Xof_ext_ { } private static void id_hash_new_(Hash_adp hash, byte[] key, int val) {hash.Add(key, Int_obj_val.new_(val));} - private static final Hash_adp_bry ext_hash = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry ext_hash = Hash_adp_bry.ci_a7() .Add_bry_bry(Bry_png).Add_bry_bry(Bry_jpg).Add_bry_bry(Bry_jpeg) .Add_bry_bry(Bry_gif).Add_bry_bry(Bry_tif).Add_bry_bry(Bry_tiff) .Add_bry_bry(Bry_svg).Add_bry_bry(Bry_djvu).Add_bry_bry(Bry_pdf) @@ -82,7 +82,7 @@ public class Xof_ext_ { public static Xof_ext new_by_ttl_(byte[] ttl) { int ttl_len = ttl.length; int dot_pos = Bry_finder.Find_bwd(ttl, Byte_ascii.Dot); - byte[] ext = (dot_pos == Bry_.NotFound || dot_pos == ttl_len) ? Bry_.Empty : Bry_.Xto_str_lower(ttl, dot_pos + 1, ttl_len); // +1 to bgn after . + byte[] ext = (dot_pos == Bry_.NotFound || dot_pos == ttl_len) ? Bry_.Empty : Bry_.Lcase__all(ttl, dot_pos + 1, ttl_len); // +1 to bgn after . return new_(Get_id_by_ext_(ext), ext); } public static Xof_ext new_by_ext_(byte[] ext) {return new_(Get_id_by_ext_(ext), ext);} diff --git a/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java b/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java index 75f743156..88f58b521 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java @@ -29,7 +29,7 @@ public class Xof_mime_minor_ { , Mime_bmp = Bry_.new_a7("x-bmp"), Mime_bmp_2 = Bry_.new_a7("x-ms-bmp"); private static final Hash_adp mime_hash = mime_hash_(); private static Hash_adp mime_hash_() { - Hash_adp rv = Hash_adp_bry.cs_(); + Hash_adp rv = Hash_adp_bry.cs(); mime_hash_itm_(rv, Xof_ext_.Bry_png , Xof_ext_.Id_png); mime_hash_itm_(rv, Xof_ext_.Bry_jpg , Xof_ext_.Id_jpg); mime_hash_itm_(rv, Xof_ext_.Bry_jpeg , Xof_ext_.Id_jpeg); diff --git a/400_xowa/src/gplx/xowa/files/exts/Xof_rule_grp.java b/400_xowa/src/gplx/xowa/files/exts/Xof_rule_grp.java index e503f00e1..1ab4648de 100644 --- a/400_xowa/src/gplx/xowa/files/exts/Xof_rule_grp.java +++ b/400_xowa/src/gplx/xowa/files/exts/Xof_rule_grp.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.exts; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.core.primitives.*; public class Xof_rule_grp implements GfoInvkAble { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); public Xof_rule_grp(Xof_rule_mgr owner, byte[] key) {this.owner = owner; this.key = key;} public Xof_rule_mgr Owner() {return owner;} private final Xof_rule_mgr owner; public byte[] Key() {return key;} private final byte[] key; diff --git a/400_xowa/src/gplx/xowa/files/exts/Xof_rule_mgr.java b/400_xowa/src/gplx/xowa/files/exts/Xof_rule_mgr.java index b69d5c24d..549c6283e 100644 --- a/400_xowa/src/gplx/xowa/files/exts/Xof_rule_mgr.java +++ b/400_xowa/src/gplx/xowa/files/exts/Xof_rule_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.exts; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.apps.*; public class Xof_rule_mgr implements GfoInvkAble { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); public Xof_rule_mgr() { Xof_rule_grp app_default = new Xof_rule_grp(this, Xof_rule_grp.Grp_app_default); Set_app_default(app_default, Io_mgr.Len_gb, Xof_ext_.Bry__ary); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java index f05d9dc14..cef7b068e 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java @@ -104,7 +104,7 @@ class Fs_root_dir { public static byte[] Xto_fil_bry(Io_url url) { byte[] rv = Bry_.new_u8(url.NameAndExt()); rv = Bry_.Replace(rv, Byte_ascii.Space, Byte_ascii.Underline); - rv = Bry_.Upper_1st(rv); + rv = Bry_.Ucase__1st(rv); return rv; } } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_mgr.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_mgr.java index 8118773cd..6df549cda 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_mgr.java @@ -27,7 +27,7 @@ public class Xog_history_mgr { if (itm == Xog_history_itm.Null) return Xoae_page.Empty; Xoae_page rv = Get_or_fetch(wiki, itm); byte[] anch_key = itm.Anch(); - rv.Url().Anchor_bry_(anch_key); // must override anchor as it may be different for cached page + rv.Url().Anch_bry_(anch_key); // must override anchor as it may be different for cached page rv.Html_data().Bmk_pos_(itm.Bmk_pos()); return rv; } @@ -62,14 +62,14 @@ public class Xog_history_mgr { Xoa_ttl ttl = Xoa_ttl.parse_(wiki, itm.Page()); return wiki.Data_mgr().Get_page(ttl, false); } - private static byte[] Build_page_key(Xoae_page page) {return Build_page_key(page.Wiki().Domain_bry(), page.Ttl().Full_url(), page.Url().Args_all_as_bry());} + private static byte[] Build_page_key(Xoae_page page) {return Build_page_key(page.Wiki().Domain_bry(), page.Ttl().Full_url(), page.Url().Qargs_mgr().To_bry());} private static byte[] Build_page_key(byte[] wiki_key, byte[] page_key, byte[] args_key) {return Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki_key, page_key, args_key);} public static Xog_history_itm new_(Xoae_page pg) { byte[] wiki = pg.Wiki().Domain_bry(); byte[] page = pg.Ttl().Full_url(); // get page_name only (no anchor; no query args) - byte[] anch = pg.Url().Anchor_bry(); - byte[] qarg = pg.Url().Args_all_as_bry(); - boolean redirect_force = pg.Url().Redirect_force(); + byte[] anch = pg.Url().Anch_bry(); + byte[] qarg = pg.Url().Qargs_mgr().To_bry(); + boolean redirect_force = pg.Url().Qargs_mgr().Match(Xoa_url_.Qarg__redirect, Xoa_url_.Qarg__redirect__yes); String bmk_pos = pg.Html_data().Bmk_pos(); if (bmk_pos == null) bmk_pos = Xog_history_itm.Html_doc_pos_toc; // never allow null doc_pos; set to top return new Xog_history_itm(wiki, page, anch, qarg, redirect_force, bmk_pos); diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java index 59f639d2c..b749118e2 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java @@ -44,10 +44,9 @@ class Xog_history_stack_fxt { if (app == null) { app = Xoa_app_fxt.app_(); wiki = Xoa_app_fxt.wiki_tst_(app); - url_parser = app.Utl__url_parser(); } return this; - } private Xoae_app app; private Xowe_wiki wiki; private Xog_history_stack stack = new Xog_history_stack(); private Xoa_url_parser url_parser; + } private Xoae_app app; private Xowe_wiki wiki; private Xog_history_stack stack = new Xog_history_stack(); public Xog_history_stack_fxt Test_cur(String expd) { Xog_history_itm page = stack.Cur_itm(); String actl = page == null ? null : String_.new_u8(page.Page()); @@ -75,8 +74,8 @@ class Xog_history_stack_fxt { Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry); Xoae_page page = Xoae_page.test_(wiki, ttl); byte[] url_bry = ttl_bry; - if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str)); - Xoa_url url = url_parser.Parse(url_bry); + if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str)); + Xoa_url url = app.User().Wikii().Utl__url_parser().Parse(url_bry); page.Url_(url); // set url b/c history_mgr.Add uses url stack.Add(Xog_history_mgr.new_(page)); return this; 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 d34b48e88..6eb75db0d 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 @@ -16,59 +16,58 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +import gplx.core.net.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.gui.views.*; public class Xog_url_wkr { - private Xoh_href href = new Xoh_href(); + private final Xoa_url tmp_url = Xoa_url.blank(); private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page; private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); - public byte Href_tid() {return href.Tid();} public Xog_url_wkr Parse(Xog_win_itm win, String href_str) { if (href_str == null) return this; // text is not link; return; byte[] href_bry = Bry_.new_u8(href_str); this.win = win; this.app = win.App(); this.page = win.Active_page(); this.wiki = win.Active_tab().Wiki(); - app.Href_parser().Parse(href, href_bry, wiki, page.Ttl().Page_url()); + app.Html__href_parser().Parse_as_url(tmp_url, href_bry, wiki, page.Ttl().Page_url()); return this; } public Xoa_url Exec() { - byte[] href_bry = href.Raw(); - switch (href.Tid()) { - case Xoh_href.Tid_null: return Rslt_handled; // url is invalid; return handled (which effectively ignores) - case Xoh_href.Tid_xowa: return Exec_url_xowa(app); // xowa:app.version - case Xoh_href.Tid_http: return Exec_url_http(app); // http://site.org - case Xoh_href.Tid_anchor: return Exec_url_anchor(win); // #anchor - case Xoh_href.Tid_xcmd: return Exec_url_xcmd(win); // /xcmd/app.version - case Xoh_href.Tid_file: return Exec_url_file(app, wiki, page, win, href_bry); // file:///xowa/A.png - default: return Exec_url_page(app, wiki, page, win, href_bry); // Page /wiki/Page + switch (tmp_url.Tid()) { + case Xoa_url_.Tid_unknown: return Xoa_url.Null; // unknown; return null which will become a noop + case Xoa_url_.Tid_inet: return Exec_url_http(app); // http://site.org + case Xoa_url_.Tid_anch: return Exec_url_anchor(win); // #anchor + case Xoa_url_.Tid_xcmd: return Exec_url_xowa(app); // xowa:app.version or /xcmd/app.version + case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, tmp_url.Raw()); // file:///xowa/A.png + case Xoa_url_.Tid_page: return Exec_url_page(app, wiki, page, win, tmp_url.Raw()); // Page /wiki/Page + default: throw Err_.new_unhandled(tmp_url.Tid()); } } private Xoa_url Exec_url_xowa(Xoae_app app) { // EX: xowa:app.version // NOTE: must catch exception else it will bubble to SWT browser and raise secondary exception of xowa is not a registered protocol - try {app.Gfs_mgr().Run_str(String_.new_u8(href.Page()));} + try {app.Gfs_mgr().Run_str(String_.new_u8(tmp_url.Page_bry()));} catch (Exception e) {app.Gui_mgr().Kit().Ask_ok("", "", Err_.Message_gplx_full(e));} return Rslt_handled; } - private Xoa_url Exec_url_http(Xoae_app app) { // EX: http:a.org - app.Prog_mgr().Exec_view_web(href.Raw()); +// private Xoa_url Exec_url_xcmd(Xog_win_itm win) { // EX: /xcmd/ +// byte[] xowa_href_bry = tmp_url.Page(); +// int xowa_href_bry_len = xowa_href_bry.length; +// int slash_pos = Bry_finder.Find_fwd(xowa_href_bry, Byte_ascii.Slash); if (slash_pos == Bry_.NotFound) slash_pos = xowa_href_bry_len; +// byte[] xowa_cmd_bry = Bry_.Mid(xowa_href_bry, 0, slash_pos); +// String xowa_cmd_str = String_.new_u8(xowa_cmd_bry); +// GfoMsg m = GfoMsg_.new_cast_(xowa_cmd_str); +// if (String_.Eq(xowa_cmd_str, Xog_win_itm.Invk_eval)) +// m.Add("cmd", String_.new_u8(xowa_href_bry, slash_pos + 1, xowa_href_bry_len)); +// win.Invk(GfsCtx.new_(), 0, xowa_cmd_str, m); +// return Rslt_handled; +// } + private Xoa_url Exec_url_http(Xoae_app app) { // EX: http://a.org + app.Prog_mgr().Exec_view_web(tmp_url.Raw()); return Rslt_handled; } private Xoa_url Exec_url_anchor(Xog_win_itm win) { // EX: #anchor - win.Active_html_itm().Scroll_page_by_id_gui(String_.new_u8(href.Anchor())); // NOTE: was originally directly; changed to call on thread; DATE:2014-05-03 - return Rslt_handled; - } - private Xoa_url Exec_url_xcmd(Xog_win_itm win) { // EX: /xcmd/ - byte[] xowa_href_bry = href.Page(); - int xowa_href_bry_len = xowa_href_bry.length; - int slash_pos = Bry_finder.Find_fwd(xowa_href_bry, Byte_ascii.Slash); if (slash_pos == Bry_.NotFound) slash_pos = xowa_href_bry_len; - byte[] xowa_cmd_bry = Bry_.Mid(xowa_href_bry, 0, slash_pos); - String xowa_cmd_str = String_.new_u8(xowa_cmd_bry); - GfoMsg m = GfoMsg_.new_cast_(xowa_cmd_str); - if (String_.Eq(xowa_cmd_str, Xog_win_itm.Invk_eval)) - m.Add("cmd", String_.new_u8(xowa_href_bry, slash_pos + 1, xowa_href_bry_len)); - win.Invk(GfsCtx.new_(), 0, xowa_cmd_str, m); + win.Active_html_itm().Scroll_page_by_id_gui(tmp_url.Anch_str()); // NOTE: was originally directly; changed to call on thread; DATE:2014-05-03 return Rslt_handled; } private Xoa_url Exec_url_file(Xoae_app app, Xowe_wiki cur_wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: file:///xowa/A.png @@ -97,59 +96,73 @@ public class Xog_url_wkr { return Rslt_handled; } private Xoa_url Exec_url_page(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19 - Xoa_url rv = app.Utl__url_parser().Parse(href_bry); // needed for query_args - byte[] anchor_bry = href.Anchor(); - byte[] page_bry = rv.Page_bry(); - byte[][] segs_ary = rv.Segs_ary(); - int segs_ary_len = segs_ary.length; - boolean use_main_page = false; - if ( segs_ary_len > 0 // handle "Special:Search/Earth" which creates segs[1] {"Special:Search"} and page="Earth" - || href.Tid() == Xoh_href.Tid_site) { // NOTE: if site, must always (a) zap Segs_ary and (b) force correct page; see tests; DATE:2014-01-21 - int segs_bgn = 0; - boolean segs_iterate = true; - if (href.Tid() == Xoh_href.Tid_site) { // site, handle multiple segs; EX: "home/wiki/", "home/wiki/Help:Contents"; DATE:2014-01-21 - if (segs_ary_len < 2) { // only 0 or 1 seg; usually occurs for logo and other xwiki links to Main_Page; EX: "/site/en.wikipedia.org/wiki/"; "/site/en.wikipedia.org/" - page_bry = wiki.Init_assert().Props().Main_page(); // use Main_page; DATE:2014-02-16 - use_main_page = true; - segs_iterate = false; - } - else - segs_bgn = 2; // start from seg_2; seg_0="/en.wikipedia.org/" and seg_1="/wiki/"; note that > 2 segs possible; EX: "/site/en.wikipedia.org/wiki/A/B/C - } - if (segs_iterate) { - Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128(); - for (int i = segs_bgn; i < segs_ary_len; i++) { - tmp_bfr.Add(segs_ary[i]); - tmp_bfr.Add_byte(Byte_ascii.Slash); - } - tmp_bfr.Add(page_bry); - page_bry = tmp_bfr.To_bry_and_rls(); - } - rv.Segs_ary_(Bry_.Ary_empty); - } - Gfo_url_arg[] qargs = rv.Args(); + Xoa_url rv = wiki.Utl__url_parser().Parse(href_bry);// needed for query_args + Gfo_qarg_itm[] qargs = rv.Qargs_ary(); int qargs_len = qargs.length; if (qargs_len > 0) { // remove anchors from qargs; EX: "to=B#mw_pages" for (int i = 0; i < qargs_len; i++) { - Gfo_url_arg arg = qargs[i]; - int anchor_pos = Bry_finder.Find_bwd(arg.Val_bry(), Byte_ascii.Hash); // NOTE: must .FindBwd to handle Category args like de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages; DATE:2013-06-18 - if (anchor_pos != Bry_.NotFound) - arg.Val_bry_(Bry_.Mid(arg.Val_bry(), 0, anchor_pos)); + Gfo_qarg_itm arg = qargs[i]; + int anch_pos = Bry_finder.Find_bwd(arg.Val_bry(), Byte_ascii.Hash); // NOTE: must .FindBwd to handle Category args like de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages; DATE:2013-06-18 + if (anch_pos != Bry_.NotFound) + arg.Val_bry_(Bry_.Mid(arg.Val_bry(), 0, anch_pos)); } } - if (!Bry_.Eq(page.Wiki().Domain_bry(), href.Wiki())) {// xwiki; EX: "file:///site/en.wiktionary.org/wiki/a"; EX: (1) goto w:Anything; (2) click on "anything" in wikt; "anything" will be parsed by en.wiki's rules, not en.wikt; DATE:2013-01-30 - wiki = app.Wiki_mgr().Get_by_key_or_make(href.Wiki()).Init_assert(); // get xwiki and set to wiki - if (use_main_page) - page_bry = wiki.Props().Main_page(); // get Main_page for new wiki; DATE:2014-02-23 - Xoa_ttl tmp_ttl = Xoa_ttl.parse_(wiki, page_bry); // reparse ttl according to xwiki's case_match rules; NOTE: do not use rv.Page_bry() or else will lose sub_pages (A/B/C); DATE:2014-02-21 - if (tmp_ttl != null) - page_bry = tmp_ttl.Full_db(); - } - rv.Wiki_bry_(wiki.Domain_bry()); // needed b/c url_parser.Parse(href) will result in wiki of "wiki" for "/wiki/Page" - rv.Page_bry_(page_bry); - rv.Anchor_bry_(anchor_bry); return rv; } +// private Xoa_url Exec_url_page(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19 +// Xoa_url rv = wiki.Utl__url_parser().Parse(href_bry);// needed for query_args +// byte[] anchor_bry = href.Anchor(); +// byte[] page_bry = rv.Page_bry(); +// byte[][] segs_ary = rv.Mids_ary(); +// int segs_ary_len = segs_ary.length; +// boolean use_main_page = false; +// if ( segs_ary_len > 0 // handle "Special:Search/Earth" which creates segs[1] {"Special:Search"} and page="Earth" +// || href.Tid() == Xoh_href_.Tid_site) { // NOTE: if site, must always (a) zap Segs_ary and (b) force correct page; see tests; DATE:2014-01-21 +// int segs_bgn = 0; +// boolean segs_iterate = true; +// if (href.Tid() == Xoh_href_.Tid_site) { // site, handle multiple segs; EX: "home/wiki/", "home/wiki/Help:Contents"; DATE:2014-01-21 +// if (segs_ary_len < 2) { // only 0 or 1 seg; usually occurs for logo and other xwiki links to Main_Page; EX: "/site/en.wikipedia.org/wiki/"; "/site/en.wikipedia.org/" +// page_bry = wiki.Init_assert().Props().Main_page(); // use Main_page; DATE:2014-02-16 +// use_main_page = true; +// segs_iterate = false; +// } +// else +// segs_bgn = 2; // start from seg_2; seg_0="/en.wikipedia.org/" and seg_1="/wiki/"; note that > 2 segs possible; EX: "/site/en.wikipedia.org/wiki/A/B/C +// } +// if (segs_iterate) { +// Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128(); +// for (int i = segs_bgn; i < segs_ary_len; i++) { +// tmp_bfr.Add(segs_ary[i]); +// tmp_bfr.Add_byte(Byte_ascii.Slash); +// } +// tmp_bfr.Add(page_bry); +// page_bry = tmp_bfr.To_bry_and_rls(); +// } +// rv.Mids_ary_(Bry_.Ary_empty); +// } +// Gfo_qarg_itm[] qargs = rv.Qargs_ary(); +// int qargs_len = qargs.length; +// if (qargs_len > 0) { // remove anchors from qargs; EX: "to=B#mw_pages" +// for (int i = 0; i < qargs_len; i++) { +// Gfo_qarg_itm arg = qargs[i]; +// int anch_pos = Bry_finder.Find_bwd(arg.Val_bry(), Byte_ascii.Hash); // NOTE: must .FindBwd to handle Category args like de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages; DATE:2013-06-18 +// if (anch_pos != Bry_.NotFound) +// arg.Val_bry_(Bry_.Mid(arg.Val_bry(), 0, anch_pos)); +// } +// } +// if (!Bry_.Eq(page.Wiki().Domain_bry(), href.Wiki())) {// xwiki; EX: "file:///site/en.wiktionary.org/wiki/a"; EX: (1) goto w:Anything; (2) click on "anything" in wikt; "anything" will be parsed by en.wiki's rules, not en.wikt; DATE:2013-01-30 +// wiki = app.Wiki_mgr().Get_by_key_or_make(href.Wiki()).Init_assert(); // get xwiki and set to wiki +// if (use_main_page) +// page_bry = wiki.Props().Main_page(); // get Main_page for new wiki; DATE:2014-02-23 +// Xoa_ttl tmp_ttl = Xoa_ttl.parse_(wiki, page_bry); // reparse ttl according to xwiki's case_match rules; NOTE: do not use rv.Page_bry() or else will lose sub_pages (A/B/C); DATE:2014-02-21 +// if (tmp_ttl != null) +// page_bry = tmp_ttl.Full_db(); +// } +// rv.Wiki_bry_(wiki.Domain_bry()); // needed b/c url_parser.Parse(href) will result in wiki of "wiki" for "/wiki/Page" +// rv.Page_bry_(page_bry); +// rv.Anch_bry_(anchor_bry); +// return rv; +// } public static Xoa_url Rslt_handled = null; public static Xoa_url Exec_url(Xog_win_itm win, String href_str) { Xog_url_wkr url_wkr = new Xog_url_wkr(); diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr_tst.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr_tst.java deleted file mode 100644 index 4149549e1..000000000 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr_tst.java +++ /dev/null @@ -1,100 +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.gui.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import org.junit.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.gui.views.*; -public class Xog_url_wkr_tst { - @Before public void init() {fxt.Clear();} private Xog_url_wkr_fxt fxt = new Xog_url_wkr_fxt(); - @Test public void term() {fxt.Clear();} - @Test public void Basic() { - fxt.Init_exec("file:///wiki/A").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("A").Test(); - } - @Test public void Basic_question() { - fxt.Init_exec("file:///wiki/A?").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("A?").Expd_qargs_("").Test(); - } - @Test public void Basic_question_text() { - fxt.Init_exec("file:///wiki/A?B").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("A?B").Expd_qargs_("").Test(); - } - @Test public void Redirect() { - fxt.Init_exec("file:///wiki/A?redirect=no").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("A").Expd_qargs_("?redirect=no").Test(); - } - @Test public void Search() { - fxt.Init_exec("file:///wiki/Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("Special:Search/Moon").Expd_qargs_("?fulltext=y&xowa_page_index=1").Test(); - } - @Test public void Ctg() { - fxt.Init_exec("file:///wiki/Category:A?pagefrom=A#mw-pages").Expd_tid_(Xoh_href.Tid_wiki).Expd_page_("Category:A").Expd_qargs_("?pagefrom=A").Expd_anchor_("mw-pages").Test(); - } - @Test public void Xwiki() { - Xow_ns_mgr ns_mgr = fxt.App().Wiki_mgr().Get_by_key_or_make(Bry_.new_a7("en.wiktionary.org")).Ns_mgr(); - - ns_mgr.Ns_main().Case_match_(Xow_ns_case_.Id_all); - fxt.Init_exec("file:///site/en.wiktionary.org/wiki/a").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wiktionary.org").Expd_page_("a").Test(); - - ns_mgr.Ns_category().Case_match_(Xow_ns_case_.Id_all); - fxt.Init_exec("file:///site/en.wiktionary.org/wiki/Category:a").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wiktionary.org").Expd_page_("Category:a").Test(); - - fxt.Init_exec("file:///site/en.wiktionary.org/wiki/A/B/C").Expd_tid_(Xoh_href.Tid_site).Expd_page_("A/B/C").Test(); - } - @Test public void Xwiki_site_sidebar() {// PURPOSE: make sure sidebar links don't fail; DATE:2014-01-21 - fxt.Init_exec("file:///site/en.wikipedia.org/wiki/A").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wikipedia.org").Expd_page_("A").Test(); - } - @Test public void Xwiki_site_logo() { // DATE:2014-01-21 - fxt.Init_exec("file:///site/en.wikipedia.org/wiki/").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wikipedia.org").Expd_page_("Main_Page").Test(); - fxt.Init_exec("file:///site/en.wikipedia.org/wiki").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wikipedia.org").Expd_page_("Main_Page").Test(); - fxt.Init_exec("file:///site/en.wikipedia.org/").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wikipedia.org").Expd_page_("Main_Page").Test(); - } - @Test public void Main_page() {// PURPOSE: Main_page does not update to use Main_page of xwiki; DATE:2014-02-23 - fxt.App().Usere().Wiki().Xwiki_mgr().Add_full("zh.wikipedia.org", "zh.wikipedia.org"); - gplx.xowa.wikis.Xoa_wiki_regy.Make_wiki_dir(fxt.App(), "zh.wikipedia.org"); - fxt.App().Wiki_mgr().Get_by_key_or_make(Bry_.new_a7("zh.wikipedia.org")).Props().Main_page_(Bry_.new_a7("Zh_Main_Page")); - fxt.App().Wiki_mgr().Get_by_key_or_make(Bry_.new_a7("en.wikipedia.org")).Props().Main_page_(Bry_.new_a7("En_Main_Page")); - fxt.Init_exec("file:///site/zh.wikipedia.org/").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("zh.wikipedia.org").Expd_page_("Zh_Main_Page").Test(); - fxt.Init_exec("file:///site/en.wikipedia.org/").Expd_tid_(Xoh_href.Tid_site).Expd_wiki_("en.wikipedia.org").Expd_page_("En_Main_Page").Test(); // still stuck at Zh - } -} -class Xog_url_wkr_fxt { - private Xoae_app app; private Xowe_wiki wiki; - private Xog_win_itm win; - private Xog_url_wkr url_wkr = new Xog_url_wkr(); - private String init_raw; - public Xoae_app App() {return app;} - public Xog_url_wkr_fxt Expd_tid_(byte v) {expd_tid = v; return this;} private byte expd_tid; - public Xog_url_wkr_fxt Expd_wiki_(String v) {expd_wiki = v; return this;} private String expd_wiki; - public Xog_url_wkr_fxt Expd_page_(String v) {expd_page = v; return this;} private String expd_page; - public Xog_url_wkr_fxt Expd_anchor_(String v) {expd_anchor = v; return this;} private String expd_anchor; - public Xog_url_wkr_fxt Expd_qargs_(String v) {expd_qargs = v; return this;} private String expd_qargs; - public void Clear() { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); - Xoa_app_fxt.Init_gui(app, wiki); - win = app.Gui_mgr().Browser_win(); - win.Active_page_(Xoae_page.test_(wiki, Xoa_ttl.parse_(wiki, Bry_.new_a7("test")))); // TODO: remove unnecessary page init - expd_wiki = expd_page = expd_qargs = expd_anchor = null; - } - public Xog_url_wkr_fxt Init_exec(String raw) { - this.init_raw = raw; - return this; - } - public void Test() { - Xoa_url url = url_wkr.Parse(win, init_raw).Exec(); - Tfds.Eq(expd_tid, url_wkr.Href_tid()); - Tfds.Eq(expd_page, String_.new_u8(url.Page_bry())); - if (expd_wiki != null) Tfds.Eq(expd_wiki , String_.new_u8(url.Wiki_bry())); - if (expd_anchor != null) Tfds.Eq(expd_anchor , String_.new_u8(url.Anchor_bry())); - if (expd_qargs != null) Tfds.Eq(expd_qargs , String_.new_u8(url.Args_all_as_bry())); - } -} diff --git a/400_xowa/src/gplx/xowa/gui/urls/url_macros/Xog_url_macro_grp.java b/400_xowa/src/gplx/xowa/gui/urls/url_macros/Xog_url_macro_grp.java index 009972aad..58c97e407 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/url_macros/Xog_url_macro_grp.java +++ b/400_xowa/src/gplx/xowa/gui/urls/url_macros/Xog_url_macro_grp.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.gui.urls.url_macros; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.gui.urls.*; import gplx.core.btries.*; public class Xog_url_macro_grp implements GfoInvkAble { - public Btrie_slim_mgr Trie() {return trie;} private Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + public Btrie_slim_mgr Trie() {return trie;} private Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); public void Del(byte[] abrv) {trie.Del(abrv);} public void Set(String abrv, String fmt) {Set(Bry_.new_u8(abrv), Bry_.new_u8(fmt));} public void Set(byte[] abrv, byte[] fmt) {trie.Add_obj(abrv, new Xog_url_macro_itm(abrv, fmt));} diff --git a/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java index 803131af5..e933ccfb1 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java @@ -49,7 +49,7 @@ public class Load_page_wkr implements Gfo_thread_wkr { Thread_adp_.Sleep(10); } Xoae_app app = wiki.Appe(); - app.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.Xto_full_str_safe()); + app.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.To_str()); if (Env_.System_memory_free() < app.Sys_cfg().Free_mem_when()) // check if low in memory app.Free_mem(false); // clear caches (which will clear bry_bfr_mk) else // not low in memory 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 0cbe2caaa..f092d3d45 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 @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.gfui.*; import gplx.xowa.gui.menus.*; import gplx.xowa.gui.menus.dom.*; import gplx.xowa.files.gui.*; -import gplx.html.*; import gplx.xowa.html.js.*; import gplx.xowa.html.heads.*; import gplx.xowa.pages.*; +import gplx.html.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.html.js.*; import gplx.xowa.html.heads.*; import gplx.xowa.pages.*; public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { private Xoae_app app; private final Object thread_lock = new Object(); private final String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_(); @@ -56,7 +56,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { Xoae_page page = owner_tab.Page(); String site = owner_tab.Wiki().Domain_str(); String ttl = String_.new_u8(page.Ttl().Full_db()); - return Xog_html_itm__href_extractor.Html_extract_text(site, ttl, v); + return Xoh_href_gui_utl.Html_extract_text(site, ttl, v); } public void Show(Xoae_page page) { byte view_mode = owner_tab.View_mode(); @@ -71,9 +71,9 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { String html_str = String_.new_u8(html_bry); if (owner_tab.Tab_mgr().Html_load_tid__url()) { Io_url html_url = app.Usere().Fsys_mgr().App_temp_html_dir().GenSubFil_ary(owner_tab.Tab_key(), ".html"); - try {html_box.Html_doc_html_load_by_url(html_url.Xto_api(), html_str);} + try {html_box.Html_doc_html_load_by_url(html_url, html_str);} catch (Exception e) { - app.Usr_dlg().Warn_many("", "", "failed to write html to file; writing directly by memory: page=~{0} file=~{1} err=~{2}", page.Url().Xto_full_str_safe(), html_url.Raw(), Err_.Message_gplx_full(e)); + app.Usr_dlg().Warn_many("", "", "failed to write html to file; writing directly by memory: page=~{0} file=~{1} err=~{2}", page.Url().To_str(), html_url.Raw(), Err_.Message_gplx_full(e)); html_box.Html_doc_html_load_by_mem(html_str); } } @@ -223,39 +223,3 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { node_path.Val_(node_path_val); } } -class Xog_html_itm__href_extractor { - private static final byte Text_tid_none = 0, Text_tid_text = 1, Text_tid_href = 2; - private static final byte Href_tid_wiki = 1, Href_tid_site = 2, Href_tid_anchor = 3; - private static final byte[] File_protocol_bry = Bry_.new_a7("file://"); - private static final int File_protocol_len = File_protocol_bry.length; - private static final Btrie_slim_mgr href_trie = Btrie_slim_mgr.cs_() - .Add_str_byte("/site/" , Href_tid_site) - .Add_str_byte("/wiki/" , Href_tid_wiki) - .Add_str_byte("#" , Href_tid_anchor) - ; - public static String Html_extract_text(String site, String page, String text_str) { - byte[] text_bry = Bry_.new_u8(text_str); - int text_tid = Byte_ascii.Xto_digit(text_bry[0]); - int text_len = text_bry.length; - switch (text_tid) { - case Text_tid_none: return ""; - case Text_tid_text: return String_.new_u8(text_bry, 2, text_len); // 2 to skip "1|" - case Text_tid_href: break; // fall through to below - default: throw Err_.new_unhandled(text_tid); - } - int href_bgn = 2; // 2 for length of "2|" - if (Bry_.Has_at_bgn(text_bry, File_protocol_bry, 2, text_len)) { - href_bgn += File_protocol_len; // skip "file://" - } - Byte_obj_val href_tid = (Byte_obj_val)href_trie.Match_bgn(text_bry, href_bgn, text_len); - if (href_tid != null) { - switch (href_tid.Val()) { - case Href_tid_wiki: return site + String_.new_u8(text_bry, href_bgn, text_len); - case Href_tid_site: return String_.new_u8(text_bry, href_bgn + 6, text_len); // +6 to skip "site/" - case Href_tid_anchor: return site + "/wiki/" + page + String_.new_u8(text_bry, href_bgn, text_len); - } - } - return String_.new_u8(text_bry, 2, text_len); // 2 to skip "2|"; handles "http://" text as well as any fall-thru from above - } - public static final Xog_html_itm__href_extractor _ = new Xog_html_itm__href_extractor(); Xog_html_itm__href_extractor() {} -} 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 index 5783b4f8e..ffc645095 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.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.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +import gplx.xowa.urls.*; class Xog_launcher_tabs { public void Launch(Xog_win_itm win) { Xoae_app app = win.App(); Gfo_log_bfr log_bfr = app.Log_bfr(); @@ -59,8 +60,8 @@ class Xog_launcher_tabs { } private void Launch_tab(Xog_win_itm win, Xowe_wiki home_wiki, String launch_str) { Xoae_app app = win.App(); - Xoa_url launch_url = Xoa_url_parser.Parse_from_url_bar(app, home_wiki, launch_str); - Xowe_wiki launch_wiki = app.Wiki_mgr().Get_by_key_or_null(launch_url.Wiki_bry()); + Xoa_url launch_url = home_wiki.Utl__url_parser().Parse_by_urlbar(launch_str); + Xowe_wiki launch_wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(launch_url.Wiki_bry()); Xoa_ttl launch_ttl = Xoa_ttl.parse_(launch_wiki, launch_url.Page_bry()); Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.new_(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23 tab.Show_url_bgn(launch_url); 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 c960a79b1..ffa18712a 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 @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.core.threads.*; import gplx.gfui.*; import gplx.xowa.gui.history.*; import gplx.xowa.gui.bnds.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa.langs.vnts.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.cfgs2.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; public class Xog_tab_itm implements GfoInvkAble { @@ -25,7 +26,7 @@ public class Xog_tab_itm implements GfoInvkAble { public Xog_tab_itm(Xog_tab_mgr tab_mgr, Gfui_tab_itm_data tab_data, Xowe_wiki wiki, Xoae_page page) { this.tab_mgr = tab_mgr; this.tab_data = tab_data; this.wiki = wiki; this.page = page; this.win = tab_mgr.Win(); this.cfg_tab_mgr = win.App().Cfg_regy ().App().Gui_mgr().Tab_mgr(); - html_itm = new Xog_html_itm(this); + this.html_itm = new Xog_html_itm(this); cmd_sync = win.Kit().New_cmd_sync(this); } public Xowe_wiki Wiki() {return wiki;} public void Wiki_(Xowe_wiki v) {this.wiki = v;} private Xowe_wiki wiki; @@ -40,6 +41,7 @@ public class Xog_tab_itm implements GfoInvkAble { if (app.App_type().Uid_is_gui()) { // NOTE: only run for gui; will cause firefox addon to fail; DATE:2014-05-03 html_box.Html_doc_html_load_by_mem(""); // NOTE: must set source, else control will be empty, and key events will not be raised; DATE:2014-04-30 IptBnd_.ipt_to_(IptCfg_.Null, html_box, this, "popup", IptEventType_.MouseDown, IptMouseBtn_.Right); + IptBnd_.cmd_to_(IptCfg_.Null, html_box, win, Xog_win_itm.Invk_exit, IptKey_.add_(IptKey_.Alt, IptKey_.F4)); // WORKAROUND:SWT: xulrunner_v24 no longer sends Alt+F4 to SwtShell; must manually subscribe it to quit; DATE:2015-07-31 GfoEvMgr_.SubSame(html_box, GfuiElemKeys.Evt_menu_detected, html_itm); gui_mgr.Bnd_mgr().Bind(Xog_bnd_box_.Tid_browser_html, html_box); if (!Env_.Mode_testing()) @@ -81,7 +83,7 @@ public class Xog_tab_itm implements GfoInvkAble { } private Xoae_page page; public void Page_update_ui() { this.Tab_name_(); - tab_box.Tab_tip_text_(page.Url().Xto_full_str()); + tab_box.Tab_tip_text_(page.Url().To_str()); } public void Tab_name_() { byte[] tab_name = page.Html_data().Custom_name(); @@ -100,21 +102,20 @@ public class Xog_tab_itm implements GfoInvkAble { public void Show_url_bgn(Xoa_url url) { this.tab_is_loading = true; Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg(); - if ( url.Anchor_str() != null // url has anchor + if ( url.Anch_str() != null // url has anchor && url.Eq_page(page.Url()) // url has same page_name as existing page - && url.Args().length == 0) { // url has no args; needed for Category:A?from=b#mw-pages - html_itm.Scroll_page_by_id_gui(url.Anchor_str()); // skip page_load and jump to anchor + && url.Qargs_ary().length == 0) { // url has no args; needed for Category:A?from=b#mw-pages + html_itm.Scroll_page_by_id_gui(url.Anch_str()); // skip page_load and jump to anchor return; } - if (url.Xowa_vnt() != null) - wiki.Lang().Vnt_mgr().Cur_vnt_(url.Xowa_vnt()); if (win.Page__async__working(url)) return; app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls if (page != null) page.Tab_data().Close_mgr().When_close(this, url); // cancel any current search cmds app.Log_wtr().Queue_enabled_(true); usr_dlg.Gui_wkr().Clear(); - this.wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); // NOTE: must update wiki - wiki.Init_assert(); // NOTE: assert wiki.Init before parsing; needed b/c lang (with lang-specific ns) is only loaded on init, and parse Xoa_ttl.parse_ will fail below; EX:pt.wikipedia.org/wiki/Wikipedia:P�gina principal + this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(url.Wiki_bry()); // NOTE: must update wiki variable; DATE:????-??-??; NOTE: must load wiki; DATE:2015-07-22 + if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); + if (url.Vnt_bry() != null) Cur_vnt_(wiki, url.Vnt_bry()); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_u8(url.Raw())); return;} Tab_name_(String_.new_u8(ttl.Full_txt())); @@ -123,6 +124,14 @@ public class Xog_tab_itm implements GfoInvkAble { this.Html_box().Html_js_eval_script("if (window.xowa_popups_hide_all != null) window.xowa_popups_hide_all();"); // should be more configurable; DATE:2014-07-09 app.Thread_mgr().Page_load_mgr().Add_at_end(new Load_page_wkr(this, wiki, url, ttl)).Run(); } + private void Cur_vnt_(Xowe_wiki wiki, byte[] vnt) { + Xoae_app app = wiki.Appe(); + gplx.xowa.apis.xowa.wikis.langs.Xoap_lang_variants vnt_mgr = app.Api_root().Wikis().Get(wiki.Domain_bry()).Lang().Variants(); + if (Bry_.Eq(vnt, vnt_mgr.Current())) return; + vnt_mgr.Current_(vnt); + app.Cfg_mgr().Set_by_app(String_.Format("xowa.api.wikis.get('{0}').lang.variants.current", wiki.Domain_str()), String_.new_u8(vnt)); + app.Cfg_mgr().Db_save_txt(); + } private void Show_url_loaded(Load_page_wkr wkr) { Xowe_wiki wiki = wkr.Wiki(); Xoae_page page = wkr.Page(); Xoa_url url = page.Url(); Xoa_ttl ttl = page.Ttl(); @@ -151,7 +160,7 @@ public class Xog_tab_itm implements GfoInvkAble { return; } if (!page.Redirected()) page.Url_(url); // NOTE: handle redirect from commons - if (page.Ttl().Anch_bgn() != Bry_.NotFound) page.Url().Anchor_bry_(page.Ttl().Anch_txt()); // NOTE: occurs when page is a redirect to an anchor; EX: w:Duck race -> Rubber duck#Races + if (page.Ttl().Anch_bgn() != Bry_.NotFound) page.Url().Anch_bry_(page.Ttl().Anch_txt()); // NOTE: occurs when page is a redirect to an anchor; EX: w:Duck race -> Rubber duck#Races history_mgr.Add(page); Xog_tab_itm_read_mgr.Show_page(this, page, true); if (app.Api_root().Usr().History().Enabled()) { @@ -203,8 +212,8 @@ public class Xog_tab_itm implements GfoInvkAble { public void Async() { if (page == null) return; // TEST: occurs during Xog_win_mgr_tst Xowe_wiki wiki = page.Wikie(); Xoae_app app = wiki.Appe(); Xog_win_itm win_itm = tab_mgr.Win(); Gfo_usr_dlg usr_dlg = win_itm.Usr_dlg(); - app.Usr_dlg().Log_many("", "", "page.async: url=~{0}", page.Url().Xto_full_str_safe()); - if (page.Url().Anchor_str() != null) html_itm.Scroll_page_by_id_gui(page.Url().Anchor_str()); + app.Usr_dlg().Log_many("", "", "page.async: url=~{0}", page.Url().To_str()); + if (page.Url().Anch_str() != null) html_itm.Scroll_page_by_id_gui(page.Url().Anch_str()); if (usr_dlg.Canceled()) {usr_dlg.Prog_none("", "", ""); app.Log_wtr().Queue_enabled_(false); return;} int xfer_len = 0; xfer_len = page.File_queue().Count(); @@ -271,7 +280,7 @@ class Load_files_wkr implements Gfo_thread_wkr { public void Exec() { try {tab.Async();} catch (Exception e) { - tab.Tab_mgr().Win().App().Usr_dlg().Warn_many("error while running file wkr; page=~{0} err=~{1}", tab.Page().Url().Xto_full_str(), Err_.Message_gplx_full(e)); + tab.Tab_mgr().Win().App().Usr_dlg().Warn_many("error while running file wkr; page=~{0} err=~{1}", tab.Page().Url().To_str(), Err_.Message_gplx_full(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 6f73e34ac..4f878f0d8 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 @@ -19,12 +19,11 @@ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa import gplx.gfui.*; import gplx.core.threads.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.gui.history.*; import gplx.xowa.pages.*; public class Xog_tab_itm_read_mgr { - private static final Xoa_url_parser url_parser = new Xoa_url_parser(); // NOTE: separate url_parser to reduce threading issues public static void Async(Xog_tab_itm tab) {tab.Async();} public static void Show_page(Xog_tab_itm tab, Xoae_page new_page, boolean reset_to_read) {Show_page(tab, new_page, reset_to_read, false, false, Xog_history_stack.Nav_fwd);} public static void Show_page(Xog_tab_itm tab, Xoae_page new_page, boolean reset_to_read, boolean new_page_is_same, boolean show_is_err, byte history_nav_type) { if (reset_to_read) tab.View_mode_(Xopg_view_mode.Tid_read); - if (new_page.Url().Action_is_edit()) tab.View_mode_(Xopg_view_mode.Tid_edit); + if (new_page.Url().Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit)) tab.View_mode_(Xopg_view_mode.Tid_edit); Xoae_page cur_page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm(); Gfui_html html_box = html_itm.Html_box(); Xog_win_itm win = tab.Tab_mgr().Win(); if (cur_page != null && !new_page_is_same) { // if new_page_is_same, don't update DocPos; will "lose" current position @@ -37,7 +36,7 @@ public class Xog_tab_itm_read_mgr { catch (Exception e) { if (String_.Eq(Err_.Message_lang(e), "class org.eclipse.swt.SWTException Widget is disposed")) return; // ignore errors caused by user closing tab early; DATE:2014-07-26 if (show_is_err) { // trying to show error page, but failed; don't show again, else recursion until out of memory; TODO:always load error page; no reason it should fail; WHEN:html_skin; DATE:2014-06-08 - Gfo_usr_dlg_.I.Warn_many("", "", "fatal error trying to load error page; page=~{0} err=~{1}" + new_page.Url().Xto_full_str_safe(), Err_.Message_gplx_full(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "fatal error trying to load error page; page=~{0} err=~{1}" + new_page.Url().To_str(), Err_.Message_gplx_full(e)); return; } else @@ -61,8 +60,8 @@ public class Xog_tab_itm_read_mgr { public static void Update_selected_tab_blank(Xog_win_itm win) {Update_selected_tab(win, null, null);} // called when all tabs are null public static void Update_selected_tab(Xog_win_itm win, Xoa_url url, Xoa_ttl ttl) { String url_str = "", win_str = Win_text_blank; - if (url != null && ttl != null) { - try {url_str = url_parser.Build_str(url);} + if (url != null && ttl != null) { // TODO: remove; no longer needed for new url parser + try {url_str = url.To_str();} catch (Exception e) { // HACK: failed pages will have a null wiki; for now, catch and ignore; DATE:2014-06-22 Gfo_usr_dlg_.I.Warn_many("", "", "failed to build url: url=~{0}, err=~{1}", String_.new_u8(url.Raw()), Err_.Message_gplx_full(e)); url_str = String_.new_u8(ttl.Full_txt()); 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 8cf77cf4b..0f36c6e80 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 @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.gfui.*; import gplx.xowa.cfgs2.*; import gplx.xowa.apis.xowa.gui.browsers.*; import gplx.xowa.specials.*; +import gplx.xowa.urls.*; public class Xog_tab_mgr implements GfoEvObj { private Ordered_hash tab_regy = Ordered_hash_.new_(); private int tab_uid = 0; public Xog_tab_mgr(Xog_win_itm win) { @@ -77,7 +78,7 @@ public class Xog_tab_mgr implements GfoEvObj { boolean active_tab_is_null = this.Active_tab_is_null(); Xowe_wiki cur_wiki = active_tab_is_null ? win.App().Usere().Wiki() : active_tab.Wiki(); Xoa_ttl ttl = Xoa_ttl.parse_(cur_wiki, Xows_special_meta_.Itm__default_tab.Ttl_bry()); - Xoa_url url = Xoa_url_parser.Parse_from_url_bar(win.App(), cur_wiki, ttl.Full_db_as_str()); + Xoa_url url = cur_wiki.Utl__url_parser().Parse_by_urlbar(ttl.Full_db_as_str()); Xog_tab_itm rv = Tabs_new(focus, active_tab_is_null, cur_wiki, Xoae_page.new_(cur_wiki, ttl)); rv.Page_update_ui(); rv.Show_url_bgn(url); @@ -102,7 +103,7 @@ public class Xog_tab_mgr implements GfoEvObj { } public void Tabs_new_dupe(boolean focus) { if (this.Active_tab_is_null()) return; - String url = active_tab.Page().Url().Xto_full_str(); + String url = active_tab.Page().Url().To_str(); Tabs_new_dflt(focus); win.Page__navigate_by_url_bar(url); } @@ -161,7 +162,7 @@ public class Xog_tab_mgr implements GfoEvObj { private void Tabs_closed(String key) { Xog_tab_itm itm = Tabs_get_by_key_or_warn(key); if (itm == null) return; itm.Html_box().Html_dispose(); - closed_undo_list.Add(itm.Page().Url().Xto_full_str()); + closed_undo_list.Add(itm.Page().Url().To_str()); tab_regy.Del(key); if (tab_regy.Count() == 0) { active_tab = Xog_tab_itm_.Null; @@ -218,7 +219,7 @@ public class Xog_tab_mgr implements GfoEvObj { public void Tabs_new_link(String link, boolean focus) { Xowe_wiki wiki = active_tab.Wiki(); Xog_tab_itm new_tab = Tabs_new(focus, false, wiki, Xoae_page.new_(wiki, active_tab.Page().Ttl())); // NOTE: do not use ttl from link, else middle-clicking pages with anchors won't work; DATE:2015-05-03 - Xoa_url url = Xoa_url_parser.Parse_from_url_bar(win.App(), wiki, link); // NOTE: link must be of form domain/wiki/page; DATE:2014-05-27 + Xoa_url url = wiki.Utl__url_parser().Parse_by_urlbar(link); // NOTE: link must be of form domain/wiki/page; DATE:2014-05-27 new_tab.Show_url_bgn(url); if (focus) tab_mgr.Tabs_select_by_idx(new_tab.Tab_idx()); 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 1e3a5c023..349e0cd9a 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 @@ -18,12 +18,14 @@ along with this program. If not, see . package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.core.threads.*; import gplx.gfui.*; import gplx.xowa.gui.*; import gplx.xowa.gui.history.*; import gplx.xowa.xtns.math.*; import gplx.xowa.files.*; import gplx.xowa.gui.urls.*; import gplx.xowa.gui.views.*; import gplx.xowa.pages.*; +import gplx.xowa.html.hrefs.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.specials.*; +import gplx.xowa.urls.*; public class Xog_win_itm implements GfoInvkAble, GfoEvObj { private GfoInvkAble sync_cmd; public Xog_win_itm(Xoae_app app, Xoa_gui_mgr gui_mgr) { this.app = app; this.gui_mgr = gui_mgr; - this.tab_mgr = new Xog_tab_mgr(this); + this.tab_mgr = new Xog_tab_mgr(this); } public Gfui_kit Kit() {return kit;} private Gfui_kit kit; public Xoa_gui_mgr Gui_mgr() {return gui_mgr;} private Xoa_gui_mgr gui_mgr; @@ -57,9 +59,9 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_link_click)) Win__link_click(); else if (ctx.Match(k, Invk_link_print)) Xog_win_itm__prog_href_mgr.Print(this); - else if (ctx.Match(k, Gfui_html.Evt_link_hover)) Xog_win_itm__prog_href_mgr.Hover(app, this.Active_tab().Wiki(), this.Active_page(), m.ReadStr("v")); + else if (ctx.Match(k, Gfui_html.Evt_link_hover)) Xog_win_itm__prog_href_mgr.Hover(app, this.Active_tab().Wiki(), this.Active_page(), Xoh_href_gui_utl.Standardize_xowa_link(m.ReadStr("v"))); else if (ctx.Match(k, Gfui_html.Evt_location_changed)) Win__link_clicked(m.ReadStr("v")); - else if (ctx.Match(k, Gfui_html.Evt_location_changing)) Page__navigate_by_internal_href(m.ReadStr("v"), tab_mgr.Active_tab()); + else if (ctx.Match(k, Gfui_html.Evt_location_changing)) Page__navigate_by_href(tab_mgr.Active_tab(), Xoh_href_gui_utl.Standardize_xowa_link(m.ReadStr("v"))); else if (ctx.Match(k, Gfui_html.Evt_win_resized)) Refresh_win_size(); else if (ctx.Match(k, Invk_page_refresh)) Page__refresh(); else if (ctx.Match(k, Invk_page_async_exec)) Xog_tab_itm_read_mgr.Async((Xog_tab_itm)m.ReadObj("v")); @@ -86,6 +88,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { else if (ctx.Match(k, Invk_app)) return app; else if (ctx.Match(k, Invk_page)) return this.Active_page(); else if (ctx.Match(k, Invk_wiki)) return this.Active_tab().Wiki(); + else if (ctx.Match(k, Invk_exit)) App__exit(); else return GfoInvkAble_.Rv_unhandled; return this; } @@ -105,6 +108,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { , Invk_page_edit_save = "page_edit_save", Invk_page_edit_save_draft = "page_edit_save_draft", Invk_page_edit_preview = "page_edit_preview", Invk_page_edit_rename = "page_edit_rename" , Invk_page_dbg_wiki = "page_dbg_wiki", Invk_page_dbg_html = "page_dbg_html" , Invk_eval = "eval" + , Invk_exit = "exit" // xowa.gfs: shortcuts , Invk_page_goto = "page_goto", Invk_page_goto_recent = "page_goto_recent" ; @@ -113,7 +117,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { if (wiki.Gui_mgr().Cfg_browser().Content_editable()) { String href = tab.Html_itm().Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, null); if (String_.Len_eq_0(href)) return; // NOTE: href can be null for images; EX: [[File:Loudspeaker.svg|11px|link=|alt=play]]; link= basically means don't link to image - Page__navigate_by_internal_href(href, tab); + Page__navigate_by_href(tab, href); } } private void Win__link_clicked(String anchor_raw) { @@ -127,7 +131,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { url_box.Text_(url + "#" + anchor_str); // update url box page.Html_data().Bmk_pos_(Xog_history_itm.Html_doc_pos_toc); // HACK: anchor clicked; set docPos of curentPage to TOC (so back will go back to TOC) tab.History_mgr().Update_html_doc_pos(page, Xog_history_stack.Nav_by_anchor); // HACK: update history_mgr; note that this must occur before setting Anchor (since Anchor will generate a new history itm) - page.Url().Anchor_bry_(anchor_bry); // update url + page.Url().Anch_bry_(anchor_bry); // update url } tab.History_mgr().Add(page); app.Usere().History_mgr().Add(page.Url(), page.Ttl(), Bry_.Add_w_dlm(Byte_ascii.Hash, page.Url().Page_bry(), anchor_bry)); @@ -155,8 +159,8 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { tab.Page_(page); wiki.ParsePage_root(page, true); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save Xoa_url url = page.Url(); - if (url.Args_exists(Xoa_url_parser.Bry_arg_action, Xoa_url_parser.Bry_arg_action_edit)) // url has ?action=edit - app.Utl__url_parser().Parse(url, url.Xto_full_bry()); // remove all query args; handle (1) s.w:Earth?action=edit; (2) click on Read; DATE:2014-03-06 + if (url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit)) // url has ?action=edit + url = tab.Wiki().Utl__url_parser().Parse(url.To_bry_full_wo_qargs()); // remove all query args; handle (1) s.w:Earth?action=edit; (2) click on Read; DATE:2014-03-06 } tab.View_mode_(new_mode_tid); if (page.Missing()) return; @@ -166,10 +170,9 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public void Page__navigate_by_search() {Page__navigate_by_url_bar(app.Gui_mgr().Win_cfg().Search_box_fmtr().Bld_str_many(search_box.Text()));} public void Page__navigate_by_url_bar(String href) { Xog_tab_itm tab = tab_mgr.Active_tab_assert(); - Xoa_url url = Xoa_url_parser.Parse_from_url_bar(app, tab.Wiki(), href); - tab.Show_url_bgn(url); + tab.Show_url_bgn(tab.Wiki().Utl__url_parser().Parse_by_urlbar(href)); } - private void Page__navigate_by_internal_href(String href, Xog_tab_itm tab) { // NOTE: different from Navigate_by_url_bar in that it handles "file:///" and other @gplx.Internal protected formats; EX: "/site/", "about:blank"; etc.. + private void Page__navigate_by_href(Xog_tab_itm tab, String href) { // NOTE: different from Navigate_by_url_bar in that it handles "file:///" and other @gplx.Internal protected formats; EX: "/site/", "about:blank"; etc.. Xoa_url url = Xog_url_wkr.Exec_url(this, href); if (url != Xog_url_wkr.Rslt_handled) tab.Show_url_bgn(url); @@ -198,10 +201,10 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm(); page.Html_data().Bmk_pos_(html_itm.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get)); html_itm.Show(page); - if (page.Url().Anchor_str() == null) + if (page.Url().Anch_str() == null) html_itm.Scroll_page_by_bmk_gui(); else - html_itm.Scroll_page_by_id_gui(page.Url().Anchor_str()); + html_itm.Scroll_page_by_id_gui(page.Url().Anch_str()); Page__async__bgn(tab); } public void Page__async__bgn(Xog_tab_itm tab) { @@ -252,8 +255,8 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { Xoae_page new_page = Xoae_page.new_(home_wiki, ttl); gplx.xowa.servers.Gxw_html_server.Assert_tab(app, new_page); // HACK: assert at least 1 tab for Firefox addon; DATE:2015-01-23 this.Active_page_(new_page); - Xoa_url url = Xoa_url.blank_(); - url = Xoa_url_parser.Parse_url(url, app, home_wiki, url_bry, 0, url_bry.length, true); + Xoa_url url = Xoa_url.blank(); + url = home_wiki.Utl__url_parser().Parse(url_bry); new_page.Url_(url); return App__retrieve_by_href(url, output_html); } @@ -261,7 +264,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public byte[] App__retrieve_by_href(String href, boolean output_html) {return App__retrieve_by_href(Xog_url_wkr.Exec_url(this, href), output_html);} // NOTE: used by drd private byte[] App__retrieve_by_href(Xoa_url url, boolean output_html) { if (url == null) return Bry_.new_a7("missing"); - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); + Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(url.Wiki_bry()); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); Xoae_page new_page = wiki.Load_page_by_ttl(url, ttl); if (new_page.Missing()) {return Bry_.Empty;} @@ -299,7 +302,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { GfoEvMgr_.SubSame_many(this, this, Gfui_html.Evt_location_changed, Gfui_html.Evt_location_changing, Gfui_html.Evt_link_hover); GfoEvMgr_.SubSame(win_box, Gfui_html.Evt_win_resized, this); - GfoEvMgr_.Sub(app.Gui_mgr().Win_cfg().Font(), Xol_font_info.Font_changed, this, Invk_window_font_changed); + GfoEvMgr_.Sub(app.Gui_mgr().Win_cfg().Font(), Xol_font_info.Font_changed, this, Invk_window_font_changed); if ( !Env_.Mode_testing() && app.App_type().Uid_is_gui()) // only run for gui; do not run for tcp/http server; DATE:2014-05-03 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 da11afb64..948c0370a 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 @@ -18,8 +18,6 @@ along with this program. If not, see . package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.gfui.*; import gplx.xowa.html.hrefs.*; public class Xog_win_itm__prog_href_mgr { - private static Xoh_href tmp_href = new Xoh_href(); - 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_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, "");// get selected href from html_box href = Xoa_app_.Utl__encoder_mgr().Href().Decode_str(href); // remove url encodings @@ -33,8 +31,9 @@ public class Xog_win_itm__prog_href_mgr { usr_dlg.Prog_direct(""); // clear out previous entry return; } - app.Href_parser().Parse(tmp_href, href, wiki, page.Ttl().Page_url()); - tmp_href.Print_to_bfr(tmp_bfr, !app.Api_root().Gui().Browser().Prog().Show_short_url()); - usr_dlg.Prog_direct(tmp_bfr.Xto_str_and_clear()); + Xoa_url url = Xoa_url.blank(); + app.Html__href_parser().Parse_as_url(url, Bry_.new_u8(href), wiki, page.Ttl().Page_txt()); +// Xoa_url url = wiki.Utl__url_parser().Parse(Bry_.new_u8(href)); + usr_dlg.Prog_direct(String_.new_u8(url.To_bry(!app.Api_root().Gui().Browser().Prog().Show_short_url(), Bool_.Y))); } } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_consts.java b/400_xowa/src/gplx/xowa/html/Xoh_consts.java index 6b7b4ab8c..c1518f741 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_consts.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_consts.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.html; import gplx.*; import gplx.xowa.*; public class Xoh_consts { public static final String - Atr_xowa_title_str = "xowa_title" + Atr_xowa_title_str = "xowa_title" , Img_w_str = "width" , Img_h_str = "height" ; @@ -31,14 +31,13 @@ public class Xoh_consts { , A_bgn = Bry_.new_a7("") - , Div_bgn_open = Bry_.new_a7("
") - , Img_bgn = Bry_.new_a7("") - , Span_bgn = Bry_.new_a7("") + , Img_bgn = Bry_.new_a7("") + , Span_bgn = Bry_.new_a7("") , Pre_bgn = Bry_.new_a7("
"), Pre_end = Bry_.new_a7("
") , Pre_bgn_open = Bry_.new_a7(". */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; -import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.wikis.*; import gplx.xowa.net.*; +import gplx.core.primitives.*; import gplx.core.net.*; +import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.wikis.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.dynamicPageList.*; import gplx.xowa.xtns.math.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.xtns.cite.*; import gplx.xowa.html.hzips.*; public class Xoh_html_wtr { @@ -633,7 +633,7 @@ class Xoh_display_ttl_wtr { Atr_key_style = Bry_.new_a7("style") , Msg_style_restricted = Bry_.new_a7(" style='/* attempt to bypass $wgRestrictDisplayTitle */'") ; - private Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_ascii_() + private Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_a7() .Add_str_byte__many(Byte_.By_int(0), "display", "user-select", "visibility"); // if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) { public boolean Is_style_restricted(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_xatr_itm atr, byte[] atr_key) { if (atr_key != null 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 5db942988..e77f40655 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java @@ -18,10 +18,7 @@ along with this program. If not, see . package gplx.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.portal.*; public class Xoh_page_mgr implements GfoInvkAble { - public Xoh_page_mgr(Xoae_app app) { - this.subpages_bldr = new Xoh_subpages_bldr(app); - } - public Xoh_subpages_bldr Subpages_bldr() {return subpages_bldr;} private Xoh_subpages_bldr subpages_bldr; + public Xoh_subpages_bldr Subpages_bldr() {return subpages_bldr;} private final Xoh_subpages_bldr subpages_bldr = new Xoh_subpages_bldr(); public boolean Font_enabled() {return font_enabled;} private boolean font_enabled = false; public void Font_enabled_(boolean v) {font_enabled = v;} public String Font_name() {return font_name;} private String font_name = "Arial"; diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java index e9ad11571..1b3c28515 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java @@ -67,11 +67,17 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { byte[] page_content_sub = Xoh_page_wtr_wkr_.Bld_page_content_sub(app, wiki, page, tmp_bfr); byte[] js_edit_toolbar_bry = view_tid == Xopg_view_mode.Tid_edit ? wiki.Fragment_mgr().Html_js_edit_toolbar() : Bry_.Empty; Xow_portal_mgr portal_mgr = wiki.Html_mgr().Portal_mgr().Init_assert(); + byte[] page_name = Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, null); // NOTE: page_name does not show display_title (). always pass in null + byte[] page_display = Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, page.Html_data().Display_ttl()); + Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); + if (vnt_mgr.Enabled()) { // VNT + page_name = vnt_mgr.Convert_text(wiki, page_name); + page_display = vnt_mgr.Convert_text(wiki, page_display); + } fmtr.Bld_bfr_many(html_bfr , root_dir_bry, Xoa_app_.Version, Xoa_app_.Build_date, app.Tcp_server().Running_str() , page.Revision_data().Id() - , Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, null) // NOTE: page_name does not show display_title (). always pass in null - , Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, page.Html_data().Display_ttl()) + , page_name, page_display , page_modified_on_msg , mgr.Css_common_bry(), mgr.Css_wiki_bry(), page.Html_data().Head_mgr().Init(app, wiki, page).Init_dflts() , page.Lang().Dir_ltr_bry(), page.Html_data().Indicators(), page_content_sub, wiki.Html_mgr().Portal_mgr().Div_jump_to(), page_body_class, html_content_editable @@ -123,9 +129,6 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { boolean tidy_enabled = tidy_mgr.Enabled(); Bry_bfr hdom_bfr = tidy_enabled ? app.Utl__bfr_mkr().Get_m001() : bfr; // if tidy, then write to tidy_bfr; note that bfr already has and written to it, so this can't be passed to tidy; DATE:2014-06-11 wiki.Html_mgr().Html_wtr().Write_all(hdom_bfr, page.Wikie().Ctx(), hctx, page.Root().Data_mid(), page.Root()); -// Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); -// if (vnt_mgr.Enabled()) // VNT -// hdom_bfr.Add(vnt_mgr.Convert_text(wiki, hdom_bfr.Xto_bry_and_clear())); if (tidy_enabled) { tidy_mgr.Run_tidy_html(page, hdom_bfr); bfr.Add_bfr_and_clear(hdom_bfr); @@ -145,6 +148,9 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg { else wiki.Html_mgr().Ctg_mgr().Bld(bfr, page, ctgs_len); } + Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); + if (vnt_mgr.Enabled()) // VNT + bfr.Add(vnt_mgr.Convert_text(wiki, bfr.Xto_bry_and_clear())); } private void Write_body_pre(Bry_bfr bfr, Xoae_app app, Xowe_wiki wiki, byte[] data_raw, Bry_bfr tmp_bfr) { Xoh_html_wtr_escaper.Escape(app.Parser_amp_mgr(), tmp_bfr, data_raw, 0, data_raw.length, false, false); diff --git a/400_xowa/src/gplx/xowa/html/Xohp_ctg_grp_mgr.java b/400_xowa/src/gplx/xowa/html/Xohp_ctg_grp_mgr.java index 71a145e46..d97a3ee71 100644 --- a/400_xowa/src/gplx/xowa/html/Xohp_ctg_grp_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xohp_ctg_grp_mgr.java @@ -53,7 +53,7 @@ class Xoh_ctg_itm_fmtr implements Bry_fmtr_arg { for (int i = 0; i < ctgs_len; i++) { byte[] page_name = page.Category_list()[i]; tmp_bfr.Add(ctg_prefix).Add(page_name); - page.Wikie().Appe().Href_parser().Build_to_bfr(tmp_href, app, wiki.Domain_bry(), wiki.Ttl_parse(tmp_bfr.Xto_bry_and_clear())); + page.Wikie().Appe().Html__href_wtr().Build_to_bfr(tmp_href, app, wiki.Domain_bry(), wiki.Ttl_parse(tmp_bfr.Xto_bry_and_clear())); itm_fmtr.Bld_bfr(bfr, tmp_href.Xto_bry_and_clear(), page_name, page_name); } tmp_bfr.Mkr_rls(); diff --git a/400_xowa/src/gplx/xowa/html/bridges/Bridge_cmd_mgr.java b/400_xowa/src/gplx/xowa/html/bridges/Bridge_cmd_mgr.java index 93b1a9422..702426331 100644 --- a/400_xowa/src/gplx/xowa/html/bridges/Bridge_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/html/bridges/Bridge_cmd_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.html.bridges; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.core.json.*; public class Bridge_cmd_mgr { - private final Hash_adp_bry cmd_hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry cmd_hash = Hash_adp_bry.cs(); public void Add(Bridge_cmd_itm cmd) {cmd_hash.Add_bry_obj(cmd.Key(), cmd);} public String Exec(GfoMsg m) { if (m.Args_count() == 0) throw Err_.new_("bridge.cmds", "no json specified for json_exec"); diff --git a/400_xowa/src/gplx/xowa/html/bridges/dbuis/Dbui_cmd_mgr.java b/400_xowa/src/gplx/xowa/html/bridges/dbuis/Dbui_cmd_mgr.java index d00c800b1..daf2cc24b 100644 --- a/400_xowa/src/gplx/xowa/html/bridges/dbuis/Dbui_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/html/bridges/dbuis/Dbui_cmd_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.html.bridges.dbuis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.bridges.*; import gplx.core.json.*; import gplx.xowa.html.bridges.dbuis.tbls.*; public class Dbui_cmd_mgr { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); private boolean init; public void Init_by_bridge(Bridge_cmd_mgr cmd_mgr) { if (init) return; diff --git a/400_xowa/src/gplx/xowa/html/bridges/dbuis/fmtrs/Dbui_tbl_fmtr.java b/400_xowa/src/gplx/xowa/html/bridges/dbuis/fmtrs/Dbui_tbl_fmtr.java index 59462601b..f414ee734 100644 --- a/400_xowa/src/gplx/xowa/html/bridges/dbuis/fmtrs/Dbui_tbl_fmtr.java +++ b/400_xowa/src/gplx/xowa/html/bridges/dbuis/fmtrs/Dbui_tbl_fmtr.java @@ -41,7 +41,7 @@ class Dbui_head_cell_fmtr implements Bry_fmtr_arg { Dbui_col_itm col = cols[i]; fmtr.Bld_bfr_many(bfr, col.Width(), col.Display()); } - bfr.Add_str_a7("\n
 
"); // btns headers + bfr.Add_str_a7("\n
 
"); // btns headers } private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index f81330a4b..9d36c538c 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -51,7 +51,7 @@ public class Xohd_hdump_wtr { public void Generate_hdump(Bry_bfr tmp_bfr, Xoae_page page) { page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last page_wtr_mgr.Wkr(Xopg_view_mode.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); - if (!Env_.Mode_testing()) page.Wikie().Html_mgr().Hzip_mgr().Write(tmp_bfr, new Xodump_stats_itm(), page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); // hzip data; + if (!Env_.Mode_testing()) page.Wikie().Html_mgr().Hzip_mgr().Write(tmp_bfr, new Xodump_stats_itm(), page.Url().To_bry_full_wo_qargs(), tmp_bfr.Xto_bry_and_clear()); // hzip data; page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_.java index bf6e460fb..a9f9d28aa 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_.java @@ -48,7 +48,7 @@ public class Xohd_abrv_ { , Html_redlink_end = Bry_.new_a7("'>") ; public static Btrie_slim_mgr new_trie() { - Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.cs(); trie_itm(rv, Tid_dir , Byte_ascii.Null , Key_dir); trie_itm(rv, Tid_img , Byte_ascii.Apos , Key_img); trie_itm(rv, Tid_img_style , Byte_ascii.Apos , Key_img_style); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java index 47e4869ac..d086e04f2 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java @@ -80,8 +80,8 @@ public class Xohd_abrv_mgr { case Xohd_abrv_.Tid_hdr_end: return wkr__hdr.Write_end(bfr, hpg, uid, rv); } if (itm.Elem_is_xnde()) rv += 2; // if xnde, skip "/>" - if (uid == bry_rdr.Or_int()) {usr_dlg.Warn_many("", "", "index is not a valid int; hpg=~{0} text=~{1}", hpg.Url().Xto_full_str_safe(), Bry_.Mid_safe(src, uid_bgn, uid_end)); return uid_end;} - if (!Int_.Between(uid, 0, imgs_len)) {usr_dlg.Warn_many("", "", "index is out of range; hpg=~{0} idx=~{1} len=~{2}", hpg.Url().Xto_full_str_safe(), uid, imgs_len); return uid_end;} + if (uid == bry_rdr.Or_int()) {usr_dlg.Warn_many("", "", "index is not a valid int; hpg=~{0} text=~{1}", hpg.Url().To_str(), Bry_.Mid_safe(src, uid_bgn, uid_end)); return uid_end;} + if (!Int_.Between(uid, 0, imgs_len)) {usr_dlg.Warn_many("", "", "index is out of range; hpg=~{0} idx=~{1} len=~{2}", hpg.Url().To_str(), uid, imgs_len); return uid_end;} if (uid >= imgs.length) return rv; Xohd_data_itm__base img = imgs[uid]; int img_view_w = img.Html_w(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java index 4aaf309c1..10e022fce 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java @@ -54,10 +54,10 @@ public class Xob_hdump_bldr { private void Hzip_data(Xoae_page page) { Xowe_wiki wiki = page.Wikie(); Xow_hzip_mgr hzip_mgr = wiki.Html_mgr().Hzip_mgr(); - page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last - wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // write to html again, except in hdump mode - if (hzip_enabled) hzip_mgr.Write(tmp_bfr, stats_itm, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); // hzip data - page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry + page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last + wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // write to html again, except in hdump mode + if (hzip_enabled) hzip_mgr.Write(tmp_bfr, stats_itm, page.Url().To_bry_full_wo_qargs(), tmp_bfr.Xto_bry_and_clear()); // hzip data + page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry } } class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java index 0b0b8f54d..24a5e1682 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java @@ -25,7 +25,7 @@ public class Xohd_page_html_mgr__load { public void Load_page(Xow_wiki wiki, Xog_page hpg, Xowd_html_tbl tbl, int page_id, Xoa_ttl page_ttl) { Xoa_app_.Usr_dlg().Plog_many("", "", "hdump.load.text: ttl=~{0}", page_ttl.Full_db_as_str()); tbl.Select_by_page(rows, page_id); - Parse_rows(wiki, hpg, page_id, Xoa_url.blank_(), page_ttl, rows); + Parse_rows(wiki, hpg, page_id, Xoa_url.blank(), page_ttl, rows); } public void Parse_rows(Xow_wiki wiki, Xog_page hpg, int page_id, Xoa_url page_url, Xoa_ttl page_ttl, List_adp rows) { // TEST: hpg.Init(wiki, page_id, page_url, page_ttl); diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href.java deleted file mode 100644 index 9a2c631d0..000000000 --- a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href.java +++ /dev/null @@ -1,75 +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.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -public class Xoh_href { - public byte[] Raw() {return raw;} public Xoh_href Raw_(byte[] v) {raw = v; return this;} private byte[] raw; - public byte[] Wiki() {return wiki;} public Xoh_href Wiki_(byte[] v) {wiki = v; return this;} private byte[] wiki; - public byte[] Page() {return page;} public Xoh_href Page_(byte[] v) {page = v; return this;} private byte[] page; - public byte[] Anchor() {return anchor;} public Xoh_href Anchor_(byte[] v) {anchor = v; return this;} private byte[] anchor; - public byte Tid() {return tid;} public Xoh_href Tid_(byte v) {tid = v; return this;} private byte tid; - public byte[] Page_and_anchor() { - if (Bry_.Len_eq_0(anchor)) return page; - else if (Bry_.Len_eq_0(page)) return anchor; - else return Bry_.Add_w_dlm(Byte_ascii.Hash, page, anchor); - } - public byte Protocol_tid() {return protocol_tid;} private byte protocol_tid; - public void Init(byte[] raw, byte protocol_tid) { - this.raw = raw; this.protocol_tid = protocol_tid; - wiki = page = anchor = null; - tid = Tid_null; - } - public void Print_to_bfr(Bry_bfr bfr, boolean full) { // currently used for status bar (not embedded in any html) - switch (tid) { - case Xoh_href.Tid_http: case Xoh_href.Tid_file: // full protocol; embed all; EX: "http://en.wikipedia.org/wiki/A"; "file:///C/dir/file.txt" - bfr.Add(raw); - break; - case Xoh_href.Tid_xowa: - bfr.Add(page); - break; - default: - if (full) { // "full" can be copied and pasted into firefox url bar - switch (tid) { - case Xoh_href.Tid_wiki: case Xoh_href.Tid_site: case Xoh_href.Tid_anchor: - bfr.Add(wiki); // add wiki_key; EX: "en.wikipedia.org" - bfr.Add(Xoh_href_parser.Href_wiki_bry); // add wiki_str; EX: "/wiki/" - bfr.Add(page); // add page; EX: "A" - if (anchor != null) - bfr.Add_byte(Byte_ascii.Hash).Add(anchor); // add anchor; EX: "#B" - break; - } - } - else { - switch (tid) { - case Xoh_href.Tid_site: - bfr.Add(wiki).Add_byte(Byte_ascii.Slash); // add wiki_key; EX: "en.wikipedia.org/" - bfr.Add(page); // add page; EX: "A" - break; - case Xoh_href.Tid_wiki: - bfr.Add(page); // add page; EX: "A" - break; - case Xoh_href.Tid_anchor: // anchor to be added below - break; - } - if (anchor != null) - bfr.Add_byte(Byte_ascii.Hash).Add(anchor); // add anchor; EX: "#B" - } - break; - } - } - public static final byte Tid_null = 0, Tid_http = 1, Tid_file = 2, Tid_wiki = 3, Tid_site = 4, Tid_xcmd = 5, Tid_anchor = 6, Tid_xowa = 7; -} diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_.java new file mode 100644 index 000000000..4a4c35f82 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_.java @@ -0,0 +1,40 @@ +/* +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.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public class Xoh_href_ { + public static final String + Str__file = "file://" + , Str__site = "/site/" + , Str__wiki = "/wiki/" + , Str__anch = "#" + ; + public static final byte[] + Bry__file = Bry_.new_a7(Str__file) + , Bry__site = Bry_.new_a7(Str__site) + , Bry__wiki = Bry_.new_a7(Str__wiki) + , Bry__anch = Bry_.new_a7(Str__anch) + , Bry__https = Bry_.new_a7("https://") // NOTE: must be "https:" or wmf api won't work; DATE:2015-06-17 + , Bry__xcmd = Bry_.new_a7("/xcmd/") + ; + public static final int + Len__file = Bry__file.length + , Len__site = Bry__site.length + , Len__wiki = Bry__wiki.length + , Len__anch = Bry__anch.length + ; +} diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl.java new file mode 100644 index 000000000..4d15a84b7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl.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.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import gplx.core.btries.*; import gplx.core.primitives.*; +public class Xoh_href_gui_utl { + public static String Html_extract_text(String site, String page, String text_str) { + byte[] text_bry = Bry_.new_u8(text_str); + int text_len = text_bry.length; + int text_tid = Byte_ascii.Xto_digit(text_bry[0]); + switch (text_tid) { + case Text_tid_none: return ""; // "0" + case Text_tid_text: return String_.new_u8(text_bry, 2, text_len); // 2 to skip "1|" + case Text_tid_href: break; // fall through to below + default: throw Err_.new_unhandled(text_tid); + } + int href_bgn = 2; // 2 to skip "2|" + if (Bry_.Has_at_bgn(text_bry, Xoh_href_.Bry__file, href_bgn, text_len)) + href_bgn += Xoh_href_.Len__file; // skip "file://" + Byte_obj_val href_tid = (Byte_obj_val)href_trie.Match_bgn(text_bry, href_bgn, text_len); + if (href_tid != null) { + switch (href_tid.Val()) { + case Href_tid_wiki: return site + String_.new_u8(text_bry, href_bgn, text_len); + case Href_tid_site: return String_.new_u8(text_bry, href_bgn + 6, text_len); // +6 to skip "site/" + case Href_tid_anch: return site + "/wiki/" + page + String_.new_u8(text_bry, href_bgn, text_len); + } + } + return String_.new_u8(text_bry, 2, text_len); // 2 to skip "2|"; handles "http://" text as well as any fall-thru from above + } + public static String Standardize_xowa_link(String str) { + byte[] bry = Bry_.new_u8(str); + int skip = Skip_start_of_xowa_link(bry, bry.length, 0); + return skip == 0 ? str : String_.Mid(str, skip); + } + private static int Skip_start_of_xowa_link(byte[] src, int src_len, int bgn) { + if (!Bry_.Has_at_bgn(src, Xoh_href_.Bry__file, bgn, src_len)) return bgn; // does not start with "file://" + int pos = bgn + Xoh_href_.Len__file; // skip "file://" + Object tid_obj = href_trie.Match_bgn(src, pos, src_len); + if (tid_obj == null) { + return bgn; // if not a known xowa link, return original bgn; + } + switch (((Byte_obj_val)tid_obj).Val()) { + case Href_tid_site: return pos; + case Href_tid_wiki: return pos; + case Href_tid_anch: return pos; + default: throw Err_.new_unhandled(tid_obj); + } + } + private static final byte Text_tid_none = 0, Text_tid_text = 1, Text_tid_href = 2; + private static final byte Href_tid_wiki = 1, Href_tid_site = 2, Href_tid_anch = 3; + private static final Btrie_slim_mgr href_trie = Btrie_slim_mgr.cs() + .Add_bry_byte(Xoh_href_.Bry__site , Href_tid_site) + .Add_bry_byte(Xoh_href_.Bry__wiki , Href_tid_wiki) + .Add_bry_byte(Xoh_href_.Bry__anch , Href_tid_anch) + ; +} +/* +NOTE_1: +. swt/mozilla treats text differently in href="{text}" when content_editable=n; occurs in LocationListener.changing +http://a.org -> http://a.org does nothing +A -> file:///A adds "file:///" +/wiki/A -> file:///wiki/A adds "file://" +Category:A -> Category:A noops; Category is assumed to be protocol? +//en.wiktionary.org/wiki/a -> file:///wiki/a strips out site name and prepends "file://"; no idea why + +. so, to handle the above, the code does the following +http://a.org -> http://a.org does nothing; nothing needed +A -> /wiki/A always prepend /wiki/ +Category:A -> /wiki/Category:A always prepend /wiki/ +//en.wiktionary.org/wiki/A -> /site/en.wiktionary.org/wiki/A always transform relative url to /site/ + +. the href will still come here as file:///wiki/A or file:///site/en.wiktionary.org/wiki/A. +. however, the file:// can be lopped off and discarded and the rest of the href will fall into one of the following cases +.. /wiki/ +.. /site/ +.. /xcmd/ +.. # +.. anything else -> assume to be really a file:// url; EX: file://C/dir/fil.txt -> C/dir/fil.txt +. the other advantage of this approach is that this proc can be reused outside of swt calls; i.e.: it can parse both "file:///wiki/A" and "/wiki/A" +*/ diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm_tst.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl_tst.java similarity index 66% rename from 400_xowa/src/gplx/xowa/gui/views/Xog_html_itm_tst.java rename to 400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl_tst.java index ec1fe3e01..74ad8ed43 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm_tst.java +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_gui_utl_tst.java @@ -15,11 +15,11 @@ 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.*; +package gplx.xowa.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import org.junit.*; -import gplx.core.primitives.*; -public class Xog_html_itm_tst { - @Before public void init() {fxt.Clear();} private Xog_html_itm_fxt fxt = new Xog_html_itm_fxt(); +import gplx.core.primitives.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.gui.views.*; +public class Xoh_href_gui_utl_tst { + @Before public void init() {fxt.Clear();} private Xoh_href_gui_utl_fxt fxt = new Xoh_href_gui_utl_fxt(); @Test public void Extract_href__text() { fxt.Test_extract_href("0|" , ""); fxt.Test_extract_href("1|selected_text" , "selected_text"); @@ -30,7 +30,7 @@ public class Xog_html_itm_tst { fxt.Test_extract_href("2|file:///wiki/Page_2" , "en.wikipedia.org/wiki/Page_2"); fxt.Test_extract_href("2|file://#anchor" , "en.wikipedia.org/wiki/Page_0#anchor"); } - @Test public void Extract_href__internal() { // + @Test public void Extract_href__internal() { fxt.Test_extract_href("2|/site/en.wiktionary.org/wiki/Page_1" , "en.wiktionary.org/wiki/Page_1"); fxt.Test_extract_href("2|/wiki/Page_2" , "en.wikipedia.org/wiki/Page_2"); fxt.Test_extract_href("2|#anchor" , "en.wikipedia.org/wiki/Page_0#anchor"); @@ -39,16 +39,21 @@ public class Xog_html_itm_tst { fxt.Test_Html_window_vpos_parse("0|0,1,2", "0", "'0','1','2'"); fxt.Test_Html_window_vpos_parse("org.eclipse.swt.SWTException: Permission denied for to get property Selection.rangeCount", null, null); // check that invalid path doesn't fail; DATE:2014-04-05 } + @Test public void Standardize_xowa_link() { + fxt.Test_standardize_xowa_link("file:///site/en.wikipedia.org/wiki/A" , "/site/en.wikipedia.org/wiki/A"); + fxt.Test_standardize_xowa_link("file:///wiki/A" , "/wiki/A"); + fxt.Test_standardize_xowa_link("file://#A" , "#A"); + } } -class Xog_html_itm_fxt { +class Xoh_href_gui_utl_fxt { public void Clear() { cur_wiki = "en.wikipedia.org"; cur_page = "Page_0"; } - public String Cur_wiki() {return cur_wiki;} public Xog_html_itm_fxt Cur_wiki_(String v) {cur_wiki = v; return this;} private String cur_wiki; - public String Cur_page() {return cur_page;} public Xog_html_itm_fxt Cur_page_(String v) {cur_page = v; return this;} private String cur_page; + public String Cur_wiki() {return cur_wiki;} public Xoh_href_gui_utl_fxt Cur_wiki_(String v) {cur_wiki = v; return this;} private String cur_wiki; + public String Cur_page() {return cur_page;} public Xoh_href_gui_utl_fxt Cur_page_(String v) {cur_page = v; return this;} private String cur_page; public void Test_extract_href(String text_str, String expd) { - Tfds.Eq(expd, Xog_html_itm__href_extractor.Html_extract_text(cur_wiki, cur_page, text_str)); + Tfds.Eq(expd, Xoh_href_gui_utl.Html_extract_text(cur_wiki, cur_page, text_str)); } private String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_(); public void Test_Html_window_vpos_parse(String raw, String expd_scroll_top, String expd_node_path) { @@ -57,4 +62,7 @@ class Xog_html_itm_fxt { Tfds.Eq(expd_scroll_top, scroll_top.Val(), expd_scroll_top); Tfds.Eq(expd_node_path, node_path.Val(), expd_node_path); } + public void Test_standardize_xowa_link(String raw, String expd) { + Tfds.Eq_str(expd, Xoh_href_gui_utl.Standardize_xowa_link(raw), "standardize"); + } } diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser.java index c1f58ffd8..7b9c67afa 100644 --- a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser.java +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser.java @@ -16,228 +16,64 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.core.btries.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.net.*; import gplx.xowa.parsers.lnkes.*; -import gplx.xowa.wikis.*; +import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.core.net.*; +import gplx.xowa.langs.vnts.*; public class Xoh_href_parser { - private Gfo_url_parser url_parser; private Gfo_url tmp_url = new Gfo_url(); - private Btrie_slim_mgr segs = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:XO_const.en; /wiki/, /site/ etc. - private Bry_bfr bfr_encoder = Bry_bfr.reset_(255), tmp_bfr = Bry_bfr.reset_(255); - public Xoh_href_parser(Url_encoder encoder, Gfo_url_parser url_parser) { - this.encoder = encoder; - this.url_parser = url_parser; - url_parser.Init_protocol(Protocol_xowa_tid, Xop_lnke_wkr.Str_xowa_protocol); - segs.Add_stubs(Seg__ary); - } - public Url_encoder Encoder() {return encoder;} private Url_encoder encoder; - public void Parse(Xoh_href rv, String raw, Xowe_wiki wiki, byte[] cur_page) {Parse(rv, Bry_.new_u8(raw), wiki, cur_page);} - public void Parse(Xoh_href rv, byte[] raw, Xowe_wiki wiki, byte[] cur_page) { - int bgn = 0, raw_len = raw.length; int file_slash_end = 0; - url_parser.Parse(tmp_url, raw, 0, raw_len); // parse as regular tmp_url to get protocol - rv.Init(raw, tmp_url.Protocol_tid()); - switch (tmp_url.Protocol_tid()) { - default: // tmp_url is known protocol ("http:", "ftp:", etc); use it and exit; do not do any substitutions EX: http://en.wikipedia.org - rv.Tid_(Xoh_href.Tid_http); - return; - case Xoo_protocol_itm.Tid_null: // unknown protocol ("unknown:A")or protocol-less ("A"); could be wiki-title or file-name; fall through to below + public void Parse_as_url(Xoa_url rv, byte[] raw, Xowe_wiki wiki, byte[] cur_page) { + int bgn = 0; + Object seg_obj = btrie.Match_bgn(raw, bgn, raw.length); // match /wiki/ or /site/ or /xcmd/ + if (seg_obj == null) { + Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); + if (vnt_mgr.Enabled() && raw[0] == Byte_ascii.Slash) { + int slash_end = Bry_finder.Find_fwd(raw, Byte_ascii.Slash, 1); + if (vnt_mgr.Vnt_grp().Has(Bry_.Mid(raw, 1, slash_end))) { + raw = Bry_.Add(wiki.Domain_bry(), raw); + } + } + } + else { // something matched + switch (((Byte_obj_val)seg_obj).Val()) { + case Seg_xcmd_tid: // convert "/xcmd/a" to "xowa-cmd:a" + raw = Bry_.Add(Gfo_protocol_itm.Bry_xcmd, Bry_.Mid(raw, btrie.Match_pos())); + bgn = 0; + break; + case Seg_wiki_tid: // skip "/wiki/" or "/site/" + case Seg_site_tid: + bgn = btrie.Match_pos(); + break; + default: + break; + } + } + wiki.Utl__url_parser().Parse(rv, raw, bgn, raw.length); + switch (rv.Tid()) { + case Xoa_url_.Tid_anch: + rv.Wiki_bry_(wiki.Domain_bry()); + rv.Page_bry_(cur_page); break; - case Xoo_protocol_itm.Tid_file: // tmp_url is "file:"; remove it; NOTE: swt/mozilla automatically prepends "file://" to any protocol-less links; see NOTE_1 below - int file_proto_len = tmp_url.Protocol_bry().length; - bgn = file_slash_end = Bry_.While_fwd(raw, Byte_ascii.Slash, file_proto_len, raw_len); - if (file_slash_end - file_proto_len > 0) --bgn; // if at least 1 slash, include slash; this ensures that all strings which have "file://" stripped will start with a "/"; EX: file:///wiki -> "/wiki"; file://C -> "/C" + case Xoa_url_.Tid_page: + Xow_wiki ttl_wiki = wiki.App().Wiki_mgri().Get_by_key_or_make_init_n(rv.Wiki_bry()); + byte[] tmp_page = rv.Page_bry(); + if (rv.Page_is_main()) + tmp_page = ttl_wiki.Props().Main_page(); + else { + if (tmp_page != null) { + if (ttl_wiki != null) { + Xoa_ttl ttl = ttl_wiki.Ttl_parse(tmp_page); + if (ttl == null) // invalid ttl; null out page; + tmp_page = Bry_.Empty; + else + tmp_page = ttl.Full_txt(); + } + } + } + rv.Page_bry_(tmp_page); break; - case Xoo_protocol_itm.Tid_xowa: - bgn = file_slash_end = Bry_.While_fwd(raw, Byte_ascii.Slash, tmp_url.Protocol_bry().length, raw_len); - rv.Tid_(Xoh_href.Tid_xowa); - rv.Wiki_(wiki.Domain_bry()); // wiki is always the current wiki - byte[] page = Xoa_app_.Utl__encoder_mgr().Gfs().Decode(Bry_.Mid(raw, bgn, raw_len)); - rv.Page_(page); // page is everything after "/xcmd/"; individual cmds will do further parsing; note that it should be decoded; EX: %20 -> " "; also note that anchor (#) or query params (?) are not parsed; the entire String will be reparsed later - return; - } - if (file_slash_end < raw_len && raw[file_slash_end] == Byte_ascii.Hash) { // 1st character is anchor; extract and return - rv.Tid_(Xoh_href.Tid_anchor); - rv.Wiki_(wiki.Domain_bry()); // wiki is always current - rv.Page_(cur_page); // page is always current - rv.Anchor_(Bry_.Mid(raw, file_slash_end + 1, raw_len)); // +1 to skip #; i.e. Anchor should be "A" not "#A" - return; - } - Object seg_obj = segs.Match_bgn(raw, bgn, raw_len); // match /wiki/ or /site/ or /xcmd/ - if (seg_obj == null) // nothing matched; assume file; EX: file:///C/dir/fil.txt -> /C/dir/fil.txt - rv.Tid_(Xoh_href.Tid_file); - else { // something matched; - Btrie_itm_stub seg = (Btrie_itm_stub)seg_obj; - bgn += seg.Val().length; - switch (seg.Tid()) { - case Seg_wiki_tid: Parse_wiki(rv, encoder, wiki, raw, bgn, raw_len); break; - case Seg_site_tid: Parse_site(rv, encoder, wiki, raw, bgn, raw_len); break; - case Seg_xcmd_tid: Parse_xcmd(rv, encoder, wiki, raw, bgn, raw_len); break; - } } } - public byte[] Build_to_bry(Xow_wiki wiki, Xoa_ttl ttl) { - synchronized (tmp_bfr) { - Build_to_bfr(tmp_bfr, wiki.App(), wiki.Domain_bry(), ttl, Bool_.N); - return tmp_bfr.Xto_bry_and_clear(); - } - } - public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl) {Build_to_bfr(bfr, app, domain_bry, ttl, Bool_.N);} - public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl, boolean force_site) { - byte[] page = ttl.Full_txt_raw(); - Xow_xwiki_itm xwiki = ttl.Wik_itm(); - if (xwiki == null) // not an xwiki; EX: [[wikt:Word]] - Build_to_bfr_page(ttl, page, 0); // write page only; NOTE: changed to remove leaf logic DATE:2014-09-07 - else { // xwiki; skip wiki and encode page only; - byte[] wik_txt = ttl.Wik_txt(); - Build_to_bfr_page(ttl, page, wik_txt.length + 1); - } - if (xwiki == null) { // not an xwiki - if (ttl.Anch_bgn() != 1) { // not an anchor-only; EX: "#A" - if (force_site) { // popup parser always writes as "/site/" - bfr.Add(Href_site_bry); // add "/site/"; EX: /site/ - bfr.Add(domain_bry); // add xwiki; EX: en_dict - bfr.Add(Href_wiki_bry); // add "/wiki/"; EX: /wiki/ - } - else - bfr.Add(Href_wiki_bry); // add "/wiki/"; EX: /wiki/Page - } - else {} // anchor: noop - } - else { // xwiki - if (app.Xwiki_mgr__missing(xwiki.Domain_bry())) { // xwiki is not offline; use http: - Bry_fmtr url_fmtr = xwiki.Url_fmtr(); - if (url_fmtr == null) { - bfr.Add(Href_https_bry); // add "https://"; EX: https:// - bfr.Add(xwiki.Domain_bry()); // add xwiki; EX: en_dict - bfr.Add(Href_wiki_bry); // add "/wiki/"; EX: /wiki/ - } - else { // url_fmtr exists; DATE:2015-04-22 - url_fmtr.Bld_bfr(bfr, bfr_encoder.Xto_bry_and_clear()); // use it and pass bfr_encoder for page_name; - return; - } - } - else { // xwiki is avaiable; use /site/ - bfr.Add(Href_site_bry); // add "/site/"; EX: /site/ - bfr.Add(xwiki.Domain_bry()); // add xwiki; EX: en_dict - bfr.Add(Href_wiki_bry); // add "/wiki/"; EX: /wiki/ - } - } - bfr.Add_bfr_and_clear(bfr_encoder); - } - private void Build_to_bfr_page(Xoa_ttl ttl, byte[] ttl_full, int page_bgn) { - int anch_bgn = Bry_finder.Find_fwd(ttl_full, Byte_ascii.Hash); // NOTE: cannot use Anch_bgn b/c Anch_bgn has bug with whitespace - if (anch_bgn == Bry_.NotFound) // no anchor; just add page - encoder.Encode(bfr_encoder, ttl_full, page_bgn, ttl_full.length); - else { // anchor exists; check if anchor is preceded by ws; EX: [[A #b]] -> "/wiki/A#b" - int page_end = Bry_finder.Find_bwd_last_ws(ttl_full, anch_bgn); // first 1st ws before #; handles multiple ws - page_end = page_end == Bry_.NotFound ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos - encoder.Encode(bfr_encoder, ttl_full, page_bgn, page_end); // add page - encoder.Encode(bfr_encoder, ttl_full, anch_bgn, ttl_full.length); // add anchor - } - } - public static final String Href_file_str = "file:///", Href_wiki_str = "/wiki/", Href_site_str = "/site/", Href_xcmd_str = "/xcmd/"; - public static final byte[] - Href_https_bry = Bry_.new_a7("https://") // NOTE: must be "https:" or wmf api won't work; DATE:2015-06-17 - , Href_file_bry = Bry_.new_a7(Href_file_str), Href_site_bry = Bry_.new_a7(Href_site_str), Href_wiki_bry = Bry_.new_a7(Href_wiki_str); - - private static final int Href_wiki_len = Href_wiki_bry.length; - static final byte Seg_null_tid = 0, Seg_wiki_tid = 1, Seg_site_tid = 2, Seg_xcmd_tid = 3; - private static final byte[] Seg_null_bry = Bry_.new_a7("/null/"), Seg_wiki_bry = Bry_.new_a7(Href_wiki_str), Seg_site_bry = Bry_.new_a7(Href_site_str), Seg_xcmd_bry = Bry_.new_a7(Href_xcmd_str); - private static final byte[][] Seg__ary = new byte[][] {Seg_null_bry, Seg_wiki_bry, Seg_site_bry, Seg_xcmd_bry}; - private static void Parse_wiki(Xoh_href rv, Url_encoder encoder, Xowe_wiki wiki, byte[] raw, int bgn, int len) { - byte[] ttl_raw = Bry_.Mid(raw, bgn, len); - Xoa_ttl ttl = wiki.Ttl_parse(ttl_raw); - if (ttl == null) { - Xoa_app_.Usr_dlg().Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_u8(raw, bgn, len)); - return; - } - if (ttl.Wik_itm() == null) { // standard href; EX: "/wiki/A" - rv.Tid_(Xoh_href.Tid_wiki); - rv.Wiki_(wiki.Domain_bry()); // wiki is always the current wiki - } - else { // embedded xwiki prefix; EX: "/wiki/fr:A" - rv.Tid_(Xoh_href.Tid_site); - rv.Wiki_(ttl.Wik_itm().Domain_bry()); // wiki is the xwiki prefix; EX: "en.wikpedia.org//wiki/fr:A" -> "fr.wikpedia.org/wiki/A" - } - byte[] page_bry = encoder.Decode(ttl.Full_txt()); // note that Full is everything except for ns, so it handles "fr:A" ("fr:" being treated as ns, so only "A" will be Full_txt) - if (Bry_.Len_eq_0(page_bry)) // handle xwiki hrefs like "fr:"; EX: "/wiki/wikipedia:" on en.wikisource.org/Main Page - page_bry = Xoa_page_.Main_page_bry_empty; -// if (ttl.Qarg_bgn() != Bry_.NotFound) -// rv.Qarg_(ttl.Qarg_txt()); - rv.Page_(page_bry); // add page; note that it should be decoded; EX: %20 -> " "; also note that anchor (#) or query params (?) are not parsed; the entire String will be reparsed later - if (ttl.Anch_bgn() != Bry_.NotFound) rv.Anchor_(ttl.Anch_txt()); - } - private static void Parse_site(Xoh_href rv, Url_encoder encoder, Xowe_wiki wiki, byte[] raw, int bgn, int len) { // /site/; EX: /site/fr.wikipedia.org/wiki/A - int slash = Bry_finder.Find_fwd(raw, Byte_ascii.Slash, bgn, len); if (slash == Bry_.NotFound) throw Err_.new_wo_type("site href is missing slash", "snip", String_.new_u8(raw, bgn, len)); - rv.Tid_(Xoh_href.Tid_site); - byte[] wiki_bry = Bry_.Mid(raw, bgn, slash); // wiki is text between "/site/" and next "/" - Xow_xwiki_itm xwiki = wiki.Appe().Usere().Wiki().Xwiki_mgr().Get_by_key(wiki_bry); // NOTE: site may refer to alias in user_wiki; ex: /site/wikisource.org which points to en.wikisource.org; this occurs during lnke substitution; EX: [//wikisource.org Wikisource] - if (xwiki != null) { - wiki_bry = xwiki.Domain_bry(); - wiki = wiki.Appe().Wiki_mgr().Get_by_key_or_make(wiki_bry); // NOTE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:alphabet - } - rv.Wiki_(wiki_bry); - int page_pos = slash + Href_wiki_len; - byte[] page_bry = page_pos < len - ? Bry_.Mid(raw, page_pos, len) // page is text after next "/" + "/wiki/"; - : Bry_.Empty; - if (Bry_.Len_eq_0(page_bry)) // handle "/site/fr.wikipedia.org/wiki/"; note that these are generated by [[fr:]] - page_bry = wiki.Props().Main_page(); // default to Main Page -// int qarg_pos = Bry_finder.Find_bwd(page_bry, Byte_ascii.Question); -// byte[] qarg_bry = null; -// if (qarg_pos != Bry_.NotFound) { -// qarg_bry = Bry_.Mid(page_bry, qarg_pos + 1, page_bry.length); -// rv.Qarg_(qarg_bry); -// page_bry = Bry_.Mid(page_bry, 0, qarg_pos); -// } - Parse_ttl_and_resolve_xwiki(rv, wiki, encoder, page_bry, raw, bgn, len); - } - private static void Parse_ttl_and_resolve_xwiki(Xoh_href rv, Xowe_wiki wiki, Url_encoder encoder, byte[] page_bry, byte[] raw, int bgn, int len) { - Xoa_ttl ttl = wiki.Ttl_parse(page_bry); - if (ttl == null) { - Xoa_app_.Usr_dlg().Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_u8(raw, bgn, len)); - rv.Page_(Bry_.Empty); - return; - } - if (ttl.Wik_itm() != null) { // page_bry has xwiki; EX: "wikt:A"; note that since this is called by "/site/", there may be two xwikis; EX: "w:wikt:"; Note that more than 2 is not being handled - wiki = wiki.Appe().Wiki_mgr().Get_by_key_or_make(ttl.Wik_itm().Domain_bry()); - rv.Wiki_(wiki.Domain_bry()); - if (Bry_.Len_eq_0(ttl.Page_txt())) // page_bry is just alias; EX: "wikt:" - page_bry = wiki.Props().Main_page(); - else - page_bry = ttl.Page_txt(); - ttl = Xoa_ttl.parse_(wiki, page_bry); if (ttl == null) throw Err_.new_wo_type("wiki href does not have valid title", "ttl", String_.new_u8(raw, bgn, len)); - } - rv.Page_(encoder.Decode(ttl.Full_txt())); // add page; note that it should be decoded; EX: %20 -> " "; also note that anchor (#) or query params (?) are not parsed; the entire String will be reparsed later - if (ttl.Anch_bgn() != Bry_.NotFound) // add anchor if it exists - rv.Anchor_(ttl.Anch_txt()); - } - private static void Parse_xcmd(Xoh_href rv, Url_encoder encoder, Xowe_wiki wiki, byte[] raw, int bgn, int len) { // /xcmd/; note encoder is passed, but don't decode for now; most invk commands have an _ which will get changed to a " "; - rv.Tid_(Xoh_href.Tid_xcmd); - rv.Wiki_(wiki.Domain_bry()); // wiki is always the current wiki - rv.Page_(Bry_.Mid(raw, bgn, len)); // page is everything after "/xcmd/"; individual cmds will do further parsing; note that it should be decoded; EX: %20 -> " "; also note that anchor (#) or query params (?) are not parsed; the entire String will be reparsed later - } - private static final byte Protocol_xowa_tid = Xoo_protocol_itm.Tid_xowa; + private static final byte Seg_wiki_tid = 0, Seg_site_tid = 1, Seg_xcmd_tid = 2; + private static final Btrie_slim_mgr btrie = Btrie_slim_mgr.ci_a7() // NOTE:ci.ascii:XO_const.en; /wiki/, /site/ etc. + .Add_bry_tid(Xoh_href_.Bry__wiki, Seg_wiki_tid) + .Add_bry_tid(Xoh_href_.Bry__site, Seg_site_tid) + .Add_bry_tid(Xoh_href_.Bry__xcmd, Seg_xcmd_tid); } -/* -NOTE_1: -. swt/mozilla treats text differently in href="{text}" when content_editable=n; occurs in LocationListener.changing -http://a.org -> http://a.org does nothing -A -> file:///A adds "file:///" -/wiki/A -> file:///wiki/A adds "file://" -Category:A -> Category:A noops; Category is assumed to be protocol? -//en.wiktionary.org/wiki/a -> file:///wiki/a strips out site name and prepends "file://"; no idea why - -. so, to handle the above, the code does the following -http://a.org -> http://a.org does nothing; nothing needed -A -> /wiki/A always prepend /wiki/ -Category:A -> /wiki/Category:A always prepend /wiki/ -//en.wiktionary.org/wiki/A -> /site/en.wiktionary.org/wiki/A always transform relative url to /site/ - -. the href will still come here as file:///wiki/A or file:///site/en.wiktionary.org/wiki/A. -. however, the file:// can be lopped off and discarded and the rest of the href will fall into one of the following cases -.. /wiki/ -.. /site/ -.. /xcmd/ -.. # -.. anything else -> assume to be really a file:// url; EX: file://C/dir/fil.txt -> C/dir/fil.txt -. the other advantage of this approach is that this proc can be reused outside of swt calls; i.e.: it can parse both "file:///wiki/A" and "/wiki/A" -*/ diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser_tst.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser_tst.java index d5cca1816..58e3a2f52 100644 --- a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser_tst.java +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_parser_tst.java @@ -16,234 +16,103 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import org.junit.*; -import gplx.xowa.net.*; -public class Xoh_href_parser_tst { - @Before public void init() {fxt.Clear();} private Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); - @Test public void Parse_full_wiki() { - fxt .Prep_raw_("file:///wiki/A") - .Expd_tid_(Xoh_href.Tid_wiki) - .Expd_full_("en.wikipedia.org/wiki/A") - .Expd_wiki_("en.wikipedia.org") - .Expd_page_("A") - .Test_parse(); +import org.junit.*; import gplx.xowa.urls.*; +public class Xoh_href_parser_tst { + private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); + @Test public void Wiki__basic() { + fxt.Run_parse_by_href("/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); } - @Test public void Parse_full_http() { - fxt .Prep_raw_("http://a.org/b") - .Expd_tid_(Xoh_href.Tid_http) - .Expd_full_("http://a.org/b") - .Test_parse(); + @Test public void Wiki__page__w_question() { + fxt.Run_parse_by_href("/wiki/%3F").Chk_page("?"); } - @Test public void Parse_full_file() { - fxt .Prep_raw_("file:///C/xowa/file/a.png") - .Expd_tid_(Xoh_href.Tid_file) - .Expd_full_("file:///C/xowa/file/a.png") - .Test_parse(); + @Test public void Wiki__qarg() { + fxt.Run_parse_by_href("/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit").Chk_to_str("en.wikipedia.org/wiki/A?action=edit"); } - @Test public void Parse_full_anchor_only() { - fxt .Prep_raw_("#a") - .Expd_tid_(Xoh_href.Tid_anchor) - .Expd_full_("en.wikipedia.org/wiki/Page 1#a") - .Expd_anch_("a") - .Test_parse(); + @Test public void Wiki__qarg__w_question() { + fxt.Run_parse_by_href("/wiki/A%3F?action=edit").Chk_page("A?").Chk_qargs("?action=edit"); } - @Test public void Parse_full_anchor_w_page() { - fxt .Prep_raw_("file:///wiki/A#b") - .Expd_tid_(Xoh_href.Tid_wiki) - .Expd_full_("en.wikipedia.org/wiki/A#b") - .Expd_anch_("b") - .Test_parse(); + @Test public void Wiki__anchor() { + fxt.Run_parse_by_href("/wiki/A#b").Chk_to_str("en.wikipedia.org/wiki/A#b").Chk_anch("b"); } - @Test public void Parse_full_xwiki() { - fxt .Prep_raw_("file:///site/en.wikt.org/wiki/Page") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikt.org/wiki/Page") - .Expd_page_("Page") - .Test_parse(); + @Test public void Wiki__xwiki__only() { + fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org"); + fxt.Run_parse_by_href("/wiki/wikt:").Chk_page_is_main_y().Chk_page("Main_Page").Chk_to_str("en.wiktionary.org/wiki/Main_Page"); } - @Test public void Parse_full_xwiki_domain_only() { - fxt .Prep_raw_("/wiki/wikt:") - .Init_xwiki_alias("wikt", "en.wiktionary.org") - .Expd_full_("en.wiktionary.org/wiki/") - .Expd_page_("") - .Test_parse(); + @Test public void Wiki__encoded() { + fxt.Run_parse_by_href("/wiki/A%22b%22c").Chk_page("A\"b\"c"); } - @Test public void Parse_full_wiki_page() { - fxt .Prep_raw_("/wiki/A") - .Expd_tid_(Xoh_href.Tid_wiki) - .Expd_full_("en.wikipedia.org/wiki/A") - .Expd_page_("A") - .Test_parse(); + @Test public void Site__basic() { + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_page("A"); } - @Test public void Parse_empty_is_main_page() { // PURPOSE: w/ slash; "wiki/" - fxt .Prep_raw_("/site/en.wikipedia.org/wiki/") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikipedia.org/wiki/Main Page") - .Expd_page_("Main Page") - .Test_parse(); + @Test public void Site__ns_case() { + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/file:A").Chk_page("File:A"); } - @Test public void Parse_empty_is_main_page_2() { // PURPOSE: wo slash; "wiki" - fxt .Prep_raw_("/site/en.wikipedia.org/wiki") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikipedia.org/wiki/Main Page") - .Expd_page_("Main Page") - .Test_parse(); + @Test public void Site__main_page() { + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/").Chk_page("Main_Page").Chk_page_is_main_y(); } - @Test public void Parse_site_page() { - fxt .Prep_raw_("/site/en.wikt.org/wiki/A") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikt.org/wiki/A") - .Expd_page_("A") - .Test_parse(); + @Test public void Site__anch() { + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A#b_c").Chk_page("A").Chk_anch("b_c"); } - @Test public void Parse_site_ns_case() { - fxt .Prep_raw_("/site/en.wikt.org/wiki/file:A") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikt.org/wiki/File:A") - .Expd_page_("File:A") - .Test_parse(); + @Test public void Site__qarg() { + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit"); } - @Test public void Parse_site_page__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces); - fxt .Prep_raw_("/site/en.wikt.org/wiki/A{{B}}") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikt.org/wiki/") - .Expd_page_("") - .Test_parse(); + @Test public void Site__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces); + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A{{B}}").Chk_page(""); } - @Test public void Parse_xcmd_edit() { - fxt .Prep_raw_("/xcmd/page_edit") - .Expd_tid_(Xoh_href.Tid_xcmd) - .Expd_full_("") - .Expd_page_("page_edit") - .Test_parse(); - } - @Test public void Parse_xowa() { - fxt .Prep_raw_("xowa-cmd:a%22b*c") - .Expd_tid_(Xoh_href.Tid_xowa) - .Expd_full_("a\"b*c") - .Expd_page_("a\"b*c") - .Test_parse(); - } - @Test public void Parse_edit_wiki_quote() { - fxt .Prep_raw_("/wiki/A%22b%22c") - .Expd_tid_(Xoh_href.Tid_wiki) - .Expd_full_("en.wikipedia.org/wiki/A\"b\"c") - .Expd_page_("A\"b\"c") - .Test_parse(); - } - - @Test public void Hover_string_wiki() {fxt.Init_hover_full_n_().Test_hover_string("file:///wiki/A" , "A");} - @Test public void Hover_string_http() {fxt.Init_hover_full_n_().Test_hover_string("http://a.org/b" , "http://a.org/b");} - @Test public void Hover_string_file() {fxt.Init_hover_full_n_().Test_hover_string("file:///C/xowa/file/a.png" , "file:///C/xowa/file/a.png");} - @Test public void Hover_string_anchor() {fxt.Init_hover_full_n_().Test_hover_string("#a" , "#a");} - @Test public void Hover_string_anchor_file() {fxt.Init_hover_full_n_().Test_hover_string("file:///#a" , "#a");} - @Test public void Hover_string_xwiki() {fxt.Init_hover_full_n_().Test_hover_string("file:///site/en.wikt.org/wiki/Page" , "en.wikt.org/Page");} - @Test public void Hover_string_xwiki_2() {fxt.Init_hover_full_n_().Expd_page_("a").Test_hover_string("/wiki/wikt:a" , "en.wiktionary.org/a");} - @Test public void Hover_string_error() {fxt.Init_hover_full_n_().Test_hover_string("file:///wiki/{{{extlink}}}" , "");} // {{{extlink}}} not a valid title; return empty -// @Test public void Parse_site_qarg() {fxt.Prep_raw_("/site/en.wikt.org/wiki/A?action=edit").Expd_tid_(Xoh_href.Tid_site).Expd_full_("en.wikt.org/wiki/A").Expd_page_("A").Expd_qarg_("action=edit").Test_parse();} -// @Test public void Parse_wiki_qarg() {fxt.Prep_raw_("/wiki/A?action=edit").Expd_tid_(Xoh_href.Tid_wiki).Expd_full_("en.wikipedia.org/wiki/A").Expd_page_("A").Expd_qarg_("action=edit").Test_parse();} - //@Test public void Parse_site_anchor() {fxt.Prep_raw_("/site/en.wikt.org/wiki/A#b_c" ).Expd_tid_(Xoh_href.Tid_site).Expd_full_("en.wikt.org/wiki/A#b_c").Expd_page_("A").Expd_anch_("b_c").Test_parse();} - @Test public void Build_xwiki_enc() {fxt.Test_build("wikt:abc?d" , "/site/en.wiktionary.org/wiki/abc%3Fd");} - @Test public void Build_page_quote() {fxt.Test_build("a\"b\"c" , "/wiki/A%22b%22c");} - @Test public void Build_page() {fxt.Test_build("abc" , "/wiki/Abc");} - @Test public void Build_page_ns() {fxt.Test_build("Image:A.png" , "/wiki/Image:A.png");} - @Test public void Build_anchor() {fxt.Test_build("#abc" , "#abc");} - @Test public void Build_page_anchor() {fxt.Test_build("Abc#def" , "/wiki/Abc#def");} - @Test public void Build_xwiki() {fxt.Test_build("wikt:abc" , "/site/en.wiktionary.org/wiki/abc");} // NOTE: "abc" not capitalized, b/c other wiki's case sensitivity is not known; this emulates WP's behavior - @Test public void Build_xwiki_2() {fxt.Test_build("wikt:Special:Search/a" , "/site/en.wiktionary.org/wiki/Special:Search/a");} - @Test public void Build_category() {fxt.Test_build("Category:abc" , "/wiki/Category:Abc");} - - @Test public void Parse_site_user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org - fxt .Prep_raw_("/site/en_wiki_alias/wiki/") - .Init_xwiki_alias("en_wiki_alias", "en.wikipedia.org") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wikipedia.org/wiki/Main Page") - .Expd_page_("Main Page") - .Test_parse(); - } - @Test public void Parse_xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet - fxt .Prep_raw_("/site/en.wiktionary.org/wiki/alphabet") - .Init_xwiki_alias("en.wiktionary.org", "en.wiktionary.org"); - Xowe_wiki en_wiktionary_org = fxt.App().Wiki_mgr().Get_by_key_or_make(Bry_.new_a7("en.wiktionary.org")); + @Test public void Site__xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet + Xowe_wiki en_wiktionary_org = fxt.Prep_create_wiki("en.wiktionary.org"); en_wiktionary_org.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Id_all); - fxt .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wiktionary.org/wiki/alphabet") - .Expd_page_("alphabet") - .Test_parse(); + fxt.Prep_add_xwiki_to_user("en.wiktionary.org", "en.wiktionary.org"); + fxt.Run_parse_by_href("/site/en.wiktionary.org/wiki/alphabet"); + fxt.Chk_to_str("en.wiktionary.org/wiki/alphabet").Chk_page("alphabet"); } - @Test public void Parse_xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25 - fxt .Prep_raw_("/site/en.wikipedia.org/wiki/wikt:") - .Init_xwiki_alias("wikt:", "en.wiktionary.org") - .Expd_tid_(Xoh_href.Tid_site) - .Expd_full_("en.wiktionary.org/wiki/Main Page") - .Expd_page_("Main Page") - .Test_parse(); + @Test public void Site__xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25 + fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org"); + fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/wikt:") + .Chk_tid(Xoa_url_.Tid_page) + .Chk_page("Main_Page") + .Chk_to_str("en.wiktionary.org/wiki/Main_Page") + ; } - @Test public void Parse_protocol() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25 - fxt .Test_parse_protocol("ftp://a.org", Xoo_protocol_itm.Tid_ftp); +// @Test public void Vnt() { +// Xowe_wiki wiki = fxt.Wiki(); +// fxt.Prep_add_xwiki_to_user("zh.wikipedia.org"); +// wiki.Lang().Vnt_mgr().Enabled_(true); +// wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant"))); +// fxt.Run_parse_by_href("/site/zh.wikipedia.org/zh-hant/A").Chk_page("A").Chk_vnt("zh-hant"); +// } + @Test public void Http__basic() { + fxt.Run_parse_by_href("http://a.org/b").Chk_tid(Xoa_url_.Tid_inet); } - @Test public void Build_xwiki_wikimedia_mail() { // PURPOSE: DATE:2015-04-22 - fxt .Init_xwiki_by_many("mail|https://lists.wikimedia.org/mailman/listinfo/$1|Wikitech Mailing List"); - fxt.Test_build("mail:A" , "https://lists.wikimedia.org/mailman/listinfo/A"); + @Test public void Prot__ftp() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25 + fxt.Run_parse_by_href("ftp://a.org").Chk_tid(Xoa_url_.Tid_inet); } -// @Test public void Parse_question_ttl() {fxt.Prep_raw_("/wiki/%3F").Expd_tid_(Xoh_href.Tid_wiki).Expd_full_("en.wikipedia.org/wiki/?").Expd_page_("?").Test_parse();} -// @Test public void Parse_question_w_arg() {fxt.Prep_raw_("/wiki/A%3F?action=edit").Expd_tid_(Xoh_href.Tid_wiki).Expd_full_("en.wikipedia.org/wiki/A??action=edit").Expd_page_("A??action=edit").Test_parse();} + @Test public void File__basic() { + fxt.Run_parse_by_href("file:///C/xowa/file/a.png").Chk_tid(Xoa_url_.Tid_file); + } + @Test public void Anchor__basic() { + fxt.Run_parse_by_href("#a").Chk_tid(Xoa_url_.Tid_anch).Chk_to_str("en.wikipedia.org/wiki/Page 1#a").Chk_anch("a"); + } + @Test public void Xcmd__basic() { + fxt.Run_parse_by_href("/xcmd/page_edit").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("page_edit"); + } + @Test public void Xowa__basic() { + fxt.Run_parse_by_href("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c"); + } + // COMMENTED: this seems wrong; [//wikisource.org] should go to https://wikisource.org not https://en.wikisource.org; both sites are different; DATE:2015-08-02 +// @Test public void Site__user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org +// fxt.Prep_xwiki(fxt.App().User().Wikii(), "en_wiki_alias", "en.wikipedia.org", null); +// fxt.Run_parse_by_href("/site/en_wiki_alias/wiki/") +// .Chk_tid(Xoa_url_.Tid_page) +// .Chk_page("Main_Page") +// .Chk_to_str("en.wikipedia.org/wiki/Main_Page") +// ; +// } } -class Xoh_href_parser_fxt { - private Xowe_wiki wiki; private Xoh_href_parser href_parser; private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private Xoh_href href = new Xoh_href(); - private static final byte[] Page_1_ttl = Bry_.new_a7("Page 1"); - public void Clear() { - expd_tid = Xoh_href.Tid_null; - prep_raw = expd_full = expd_wiki = expd_page = expd_anch = null; - if (app != null) return; - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); - wiki.Xwiki_mgr().Add_bulk(Bry_.new_a7("wikt|en.wiktionary.org")); - app.Usere().Wiki().Xwiki_mgr().Add_bulk(Bry_.new_a7("en.wiktionary.org|en.wiktionary.org")); - href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), app.Utl__url_parser().Url_parser()); - } - public Xoae_app App() {return app;} private Xoae_app app; - public Xoh_href_parser_fxt Init_xwiki_alias(String alias, String domain) { - app.Usere().Wiki().Xwiki_mgr().Add_full(alias, domain); +class Xoh_href_parser_fxt extends Xoa_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser(); + public Xoh_href_parser_fxt Run_parse_by_href(String raw) { + href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), cur_wiki, Bry__page_1); return this; } - public Xoh_href_parser_fxt Init_xwiki_by_many(String raw) { - wiki.Xwiki_mgr().Add_many(Bry_.new_u8(raw)); // need to add to wiki's xwiki_mgr for ttl_parse - return this; - } - public Xoh_href_parser_fxt Init_hover_full_y_() {return Init_hover_full_(Bool_.Y);} - public Xoh_href_parser_fxt Init_hover_full_n_() {return Init_hover_full_(Bool_.N);} - public Xoh_href_parser_fxt Init_hover_full_(boolean v) {show_full_hover_string = v; return this;} - public Xoh_href_parser_fxt Prep_raw_(String v) {this.prep_raw = v; return this;} private String prep_raw; - public Xoh_href_parser_fxt Expd_tid_(byte v) {this.expd_tid = v; return this;} private byte expd_tid; - public Xoh_href_parser_fxt Expd_full_(String v) {this.expd_full = v; return this;} private String expd_full; - public Xoh_href_parser_fxt Expd_wiki_(String v) {this.expd_wiki = v; return this;} private String expd_wiki; - public Xoh_href_parser_fxt Expd_page_(String v) {this.expd_page = v; return this;} private String expd_page; - public Xoh_href_parser_fxt Expd_anch_(String v) {this.expd_anch = v; return this;} private String expd_anch; - public void Test_parse() { - href_parser.Parse(href, prep_raw, wiki, Page_1_ttl); - if (expd_tid != Xoh_href.Tid_null) Tfds.Eq(expd_tid, href.Tid()); - if (expd_wiki != null) Tfds.Eq(expd_wiki, String_.new_u8(href.Wiki())); - if (expd_page != null) Tfds.Eq(expd_page, String_.new_u8(href.Page())); - if (expd_anch != null) Tfds.Eq(expd_anch, String_.new_u8(href.Anchor())); - if (expd_full != null) { - href.Print_to_bfr(tmp_bfr, true); - Tfds.Eq(expd_full, tmp_bfr.Xto_str_and_clear()); - } - } - private boolean show_full_hover_string = false; - public void Test_hover_string(String raw, String expd) { - href_parser.Parse(href, raw, wiki, Page_1_ttl); - href.Print_to_bfr(tmp_bfr, show_full_hover_string); - Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); - } - public void Test_build(String raw, String expd) { - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_u8(raw)); - href_parser.Build_to_bfr(tmp_bfr, app, wiki.Domain_bry(), ttl); - Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); - } - public void Test_parse_protocol(String raw, byte expd_tid) { - href_parser.Parse(href, raw, wiki, Page_1_ttl); - Tfds.Eq(expd_tid, href.Protocol_tid()); - } + private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1"); } diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr.java new file mode 100644 index 000000000..7047ef6a8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr.java @@ -0,0 +1,83 @@ +/* +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.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import gplx.xowa.wikis.xwikis.*; +public class Xoh_href_wtr { + private final Bry_bfr encoder_bfr = Bry_bfr.reset_(255), tmp_bfr = Bry_bfr.reset_(255); + private final Url_encoder encoder = Xoa_app_.Utl__encoder_mgr().Href(); + public byte[] Build_to_bry(Xow_wiki wiki, Xoa_ttl ttl) { + synchronized (tmp_bfr) { + Build_to_bfr(tmp_bfr, wiki.App(), wiki.Domain_bry(), ttl, Bool_.N); + return tmp_bfr.Xto_bry_and_clear(); + } + } + public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl) {Build_to_bfr(bfr, app, domain_bry, ttl, Bool_.N);} + public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl, boolean force_site) { + byte[] page = ttl.Full_txt_raw(); + Xow_xwiki_itm xwiki = ttl.Wik_itm(); + if (xwiki == null) // not an xwiki; EX: [[wikt:Word]] + Build_to_bfr_page(ttl, page, 0); // write page only; NOTE: changed to remove leaf logic DATE:2014-09-07 + else { // xwiki; skip wiki and encode page only; + byte[] wik_txt = ttl.Wik_txt(); + Build_to_bfr_page(ttl, page, wik_txt.length + 1); + } + if (xwiki == null) { // not an xwiki + if (ttl.Anch_bgn() != 1) { // not an anchor-only; EX: "#A" + if (force_site) { // popup parser always writes as "/site/" + bfr.Add(Xoh_href_.Bry__site); // add "/site/"; EX: /site/ + bfr.Add(domain_bry); // add xwiki; EX: en_dict + bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/"; EX: /wiki/ + } + else + bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/"; EX: /wiki/Page + } + else {} // anchor: noop + } + else { // xwiki + if (app.Xwiki_mgr__missing(xwiki.Domain_bry())) { // xwiki is not offline; use http: + Bry_fmtr url_fmtr = xwiki.Url_fmtr(); + if (url_fmtr == null) { + bfr.Add(Xoh_href_.Bry__https); // add "https://"; EX: https:// + bfr.Add(xwiki.Domain_bry()); // add xwiki; EX: en_dict + bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/"; EX: /wiki/ + } + else { // url_fmtr exists; DATE:2015-04-22 + url_fmtr.Bld_bfr(bfr, encoder_bfr.Xto_bry_and_clear()); // use it and pass encoder_bfr for page_name; + return; + } + } + else { // xwiki is avaiable; use /site/ + bfr.Add(Xoh_href_.Bry__site); // add "/site/"; EX: /site/ + bfr.Add(xwiki.Domain_bry()); // add xwiki; EX: en_dict + bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/"; EX: /wiki/ + } + } + bfr.Add_bfr_and_clear(encoder_bfr); + } + private void Build_to_bfr_page(Xoa_ttl ttl, byte[] ttl_full, int page_bgn) { + int anch_bgn = Bry_finder.Find_fwd(ttl_full, Byte_ascii.Hash); // NOTE: cannot use Anch_bgn b/c Anch_bgn has bug with whitespace + if (anch_bgn == Bry_.NotFound) // no anchor; just add page + encoder.Encode(encoder_bfr, ttl_full, page_bgn, ttl_full.length); + else { // anchor exists; check if anchor is preceded by ws; EX: [[A #b]] -> "/wiki/A#b" + int page_end = Bry_finder.Find_bwd_last_ws(ttl_full, anch_bgn); // first 1st ws before #; handles multiple ws + page_end = page_end == Bry_.NotFound ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos + encoder.Encode(encoder_bfr, ttl_full, page_bgn, page_end); // add page + encoder.Encode(encoder_bfr, ttl_full, anch_bgn, ttl_full.length); // add anchor + } + } +} diff --git a/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr_tst.java b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr_tst.java new file mode 100644 index 000000000..c7d3f87a2 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hrefs/Xoh_href_wtr_tst.java @@ -0,0 +1,59 @@ +/* +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.html.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import org.junit.*; +import gplx.core.net.*; +public class Xoh_href_wtr_tst { + private final Xoh_href_wtr_fxt fxt = new Xoh_href_wtr_fxt(); + @Test public void Xwiki_enc() {fxt.Test_build("wikt:abc?d" , "/site/en.wiktionary.org/wiki/abc%3Fd");} + @Test public void Page_quote() {fxt.Test_build("a\"b\"c" , "/wiki/A%22b%22c");} + @Test public void Page() {fxt.Test_build("abc" , "/wiki/Abc");} + @Test public void Page_ns() {fxt.Test_build("Image:A.png" , "/wiki/Image:A.png");} + @Test public void Anchor() {fxt.Test_build("#abc" , "#abc");} + @Test public void Page_anchor() {fxt.Test_build("Abc#def" , "/wiki/Abc#def");} + @Test public void Xwiki() {fxt.Test_build("wikt:abc" , "/site/en.wiktionary.org/wiki/abc");} // NOTE: "abc" not capitalized, b/c other wiki's case sensitivity is not known; this emulates WP's behavior + @Test public void Xwiki_2() {fxt.Test_build("wikt:Special:Search/a" , "/site/en.wiktionary.org/wiki/Special:Search/a");} + @Test public void Category() {fxt.Test_build("Category:abc" , "/wiki/Category:Abc");} + @Test public void Xwiki_wikimedia_mail() { // PURPOSE: DATE:2015-04-22 + fxt.Prep_xwiki_by_many("mail|https://lists.wikimedia.org/mailman/listinfo/$1|Wikitech Mailing List"); + fxt.Test_build("mail:A" , "https://lists.wikimedia.org/mailman/listinfo/A"); + } +} +class Xoh_href_wtr_fxt { + private final Xowe_wiki wiki; + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + private final Xoh_href_wtr href_wtr = new Xoh_href_wtr(); + public Xoh_href_wtr_fxt() { + this.app = Xoa_app_fxt.app_(); + this.wiki = Xoa_app_fxt.wiki_tst_(app); + wiki.Xwiki_mgr().Add_bulk(Bry_.new_a7("wikt|en.wiktionary.org")); + app.Usere().Wiki().Xwiki_mgr().Add_bulk(Bry_.new_a7("en.wiktionary.org|en.wiktionary.org")); + } + public Xoae_app App() {return app;} private final Xoae_app app; + public Xoh_href_wtr_fxt Prep_wiki_cs(String domain) { + Xow_wiki wiki = app.Wiki_mgr().Get_by_key_or_make_init_n(Bry_.new_u8(domain)); + wiki.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Id_all); + return this; + } + public Xoh_href_wtr_fxt Prep_xwiki_by_many(String raw) {wiki.Xwiki_mgr().Add_many(Bry_.new_u8(raw)); return this;} // need to add to wiki's xwiki_mgr for ttl_parse + public void Test_build(String raw, String expd) { + Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_u8(raw)); + href_wtr.Build_to_bfr(tmp_bfr, app, wiki.Domain_bry(), ttl); + Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); + } +} diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java index 66d90ecbf..45fab269b 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java @@ -80,7 +80,7 @@ public class Xow_hzip_itm__anchor { if (id_bgn > a_lhs_end) return Xow_hzip_mgr.Unhandled; id_bgn += Find_id_bry.length + gplx.xowa.parsers.lnkis.redlinks.Xopg_redlink_lnki_list.Lnki_id_prefix_len; int id_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, id_bgn, src_len); if (id_end == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled; - int id = Bry_.Xto_int_or(src, id_bgn, id_end, -1); if (id == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled; + int id = Bry_.To_int_or(src, id_bgn, id_end, -1); if (id == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled; int a_rhs_bgn = Bry_finder.Find_fwd(src, Find_a_rhs_bgn_bry, a_lhs_end, src_len); if (a_rhs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_rhs_bgn_missing", bgn, ttl_end); int ttl_len = ttl_end - ttl_bgn; int html_text_len = a_rhs_bgn - a_lhs_end; @@ -132,7 +132,7 @@ public class Xow_hzip_itm__anchor { int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, href_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, href_end); int num_bgn = a_lhs_end + 2; // skip >[ int num_end = Bry_finder.Find_fwd(src, Byte_ascii.Brack_end, num_bgn, src_len); if (num_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.num_end_missing", bgn, href_end); - int num = Bry_.Xto_int_or(src, num_bgn, num_end, -1); if (num == -1) return hzip_mgr.Warn_by_pos_add_dflt("a.num_invalid", num_bgn, num_end); + int num = Bry_.To_int_or(src, num_bgn, num_end, -1); if (num == -1) return hzip_mgr.Warn_by_pos_add_dflt("a.num_invalid", num_bgn, num_end); Xow_hzip_int_.Save_bin_int_abrv(bfr, num); int a_rhs_bgn = num_end + 1; int a_rhs_end = a_rhs_bgn + Find_a_rhs_bgn_len; diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java index ced4aead3..35533ee9b 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java @@ -68,17 +68,17 @@ class Xow_hzip_itm__href { , Tid_ext_asp = 6 , Tid_ext_aspx = 7 ; -// private static final Btrie_slim_mgr proto_trie = Btrie_slim_mgr.ci_ascii_() +// private static final Btrie_slim_mgr proto_trie = Btrie_slim_mgr.ci_a7() // .Add_str_byte("http", Tid_proto_http) // .Add_str_byte("https", Tid_proto_http) // ; -// private static final Btrie_slim_mgr tld_trie = Btrie_slim_mgr.ci_ascii_() +// private static final Btrie_slim_mgr tld_trie = Btrie_slim_mgr.ci_a7() // .Add_str_byte("com", Tid_tld_com) // .Add_str_byte("org", Tid_tld_org) // .Add_str_byte("net", Tid_tld_net) // .Add_str_byte("gov", Tid_tld_gov) // ; -// private static final Btrie_slim_mgr ext_trie = Btrie_slim_mgr.ci_ascii_() +// private static final Btrie_slim_mgr ext_trie = Btrie_slim_mgr.ci_a7() // .Add_str_byte("htm", Tid_ext_htm) // .Add_str_byte("html", Tid_ext_html) // .Add_str_byte("php", Tid_ext_php) diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java index 06fcc80e9..8286003aa 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java @@ -101,7 +101,7 @@ public class Xow_hzip_mgr { , Tid_a_rhs = 1 , Tid_h_lhs = 2 ; - private Btrie_slim_mgr btrie = Btrie_slim_mgr.cs_() + private Btrie_slim_mgr btrie = Btrie_slim_mgr.cs() .Add_str_byte("
" , Tid_a_rhs) // .Add_str_byte(". package gplx.xowa.html.portal; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hrefs.*; public class Xoh_subpages_bldr implements Bry_fmtr_arg { - private Xoae_app app; private Bry_bfr tmp_bfr = Bry_bfr.reset_(255), ttl_bfr = Bry_bfr.reset_(255); private byte[][] segs; - public Xoh_subpages_bldr(Xoae_app app) {this.app = app;} public byte[] Bld(Xow_ns_mgr ns_mgr, Xoa_ttl ttl) { Xow_ns ns = ttl.Ns(); if (! ( ns.Subpages_enabled() // ns has subpages @@ -47,8 +45,8 @@ public class Xoh_subpages_bldr implements Bry_fmtr_arg { byte[] seg = segs[i]; ttl_bfr.Add(seg); byte[] seg_ttl = ttl_bfr.Xto_bry(); - byte[] seg_ttl_enc = app.Href_parser().Encoder().Encode(ttl_bfr.Xto_bry()); - byte[] href = Bry_.Add(Xoh_href_parser.Href_wiki_bry, seg_ttl_enc); // EX: /wiki/Help:A + byte[] seg_ttl_enc = Xoa_app_.Utl__encoder_mgr().Href().Encode(ttl_bfr.Xto_bry()); + byte[] href = Bry_.Add(Xoh_href_.Bry__wiki, seg_ttl_enc); // EX: /wiki/Help:A fmtr_itm.Bld_bfr(bfr, dlm, href, seg_ttl, seg); } ttl_bfr.Clear(); diff --git a/400_xowa/src/gplx/xowa/html/portal/Xoh_subpages_bldr_tst.java b/400_xowa/src/gplx/xowa/html/portal/Xoh_subpages_bldr_tst.java index db1c8ecb3..3bc00cb4b 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xoh_subpages_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xoh_subpages_bldr_tst.java @@ -35,13 +35,12 @@ public class Xoh_subpages_bldr_tst { } class Xoh_subpages_bldr_fxt { private Xoae_app app; - private Xoh_subpages_bldr subpages_bldr; + private Xoh_subpages_bldr subpages_bldr = new Xoh_subpages_bldr(); public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public void Init() { this.app = Xoa_app_fxt.app_(); this.wiki = Xoa_app_fxt.wiki_tst_(app); wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Id_help).Subpages_enabled_(true); - this.subpages_bldr = new Xoh_subpages_bldr(app); } public void Test_bld(String ttl_str, String expd) { byte[] actl = subpages_bldr.Bld(wiki.Ns_mgr(), Xoa_ttl.parse_(wiki, Bry_.new_u8(ttl_str))); 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 9a1ad2951..80bafa41b 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 @@ -45,8 +45,8 @@ public class Xow_portal_mgr implements GfoInvkAble { Init_fmtr(tmp_bfr, eval_mgr, div_view_fmtr); Init_fmtr(tmp_bfr, eval_mgr, div_ns_fmtr); 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).Xto_bry_and_clear(); // NOTE: build /site/en.wikipedia.org/wiki/ href; no Main_Page, as that will be inserted by Xoh_href_parser + div_personal_bry = Init_fmtr(tmp_bfr, eval_mgr, div_personal_fmtr, Bry_.Add(Xoh_href_.Bry__wiki, 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_.Bry__wiki, 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_.Bry__site).Add(wiki.Domain_bry()).Add(Xoh_href_.Bry__wiki).Xto_bry_and_clear(); // 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, Xoa_app_.Utl__encoder_mgr().Fsys().Encode_http(wiki.Appe().Usere().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); @@ -69,14 +69,14 @@ public class Xow_portal_mgr implements GfoInvkAble { else subj_cls = Xow_portal_mgr.Cls_selected_y; Bry_fmtr_arg vnt_menu = null; -// Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); // VNT; DATE:2015-03-03 -// if (vnt_mgr.Enabled()) { -// Vnt_mnu_grp_fmtr vnt_menu_fmtr = vnt_mgr.Vnt_mnu_fmtr(); -// vnt_menu_fmtr.Init(vnt_mgr.Vnt_grp(), ttl.Full_db(), vnt_mgr.Cur_vnt()); -// vnt_menu = wiki.Lang().Vnt_mgr().Enabled() ? vnt_menu_fmtr : null; -// } + Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); // VNT; DATE:2015-03-03 + if (vnt_mgr.Enabled()) { + Vnt_mnu_grp_fmtr vnt_menu_fmtr = vnt_mgr.Vnt_mnu_fmtr(); + vnt_menu_fmtr.Init(vnt_mgr.Vnt_grp(), wiki.Domain_bry(), ttl.Full_db(), vnt_mgr.Cur_vnt()); + vnt_menu = wiki.Lang().Vnt_mgr().Enabled() ? vnt_menu_fmtr : null; + } Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - div_ns_fmtr.Bld_bfr_many(tmp_bfr, Bry_.Add(Xoh_href_parser.Href_wiki_bry, ttl.Subj_txt()), subj_cls, Bry_.Add(Xoh_href_parser.Href_wiki_bry, ttl.Talk_txt()), talk_cls, vnt_menu); + div_ns_fmtr.Bld_bfr_many(tmp_bfr, Bry_.Add(Xoh_href_.Bry__wiki, ttl.Subj_txt()), subj_cls, Bry_.Add(Xoh_href_.Bry__wiki, ttl.Talk_txt()), talk_cls, vnt_menu); return tmp_bfr.To_bry_and_rls(); } private byte[] Ns_cls_by_ord(Xow_ns_mgr ns_mgr, int ns_ord) { 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 2a15ded64..8874fbb5d 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 @@ -90,7 +90,7 @@ public class Xowh_sidebar_mgr implements GfoInvkAble { cur_grp.Itms_add(cur_itm); } } - } private Xoa_url tmp_url = Xoa_url.blank_(); + } private Xoa_url tmp_url = Xoa_url.blank(); public void Bld_html(Bry_bfr bfr) { int len = grps.Count(); for (int i = 0; i < len; i++) { @@ -125,7 +125,7 @@ public class Xowh_sidebar_mgr implements GfoInvkAble { } private static final String Invk_html_grp_fmt_ = "html_grp_fmt_", Invk_html_itm_fmt_ = "html_itm_fmt_"; private static final byte[] CONST_id_prefix = Bry_.new_a7("n-"); private static final byte Ignore_tid_search = 1, Ignore_tid_toolbox = 2, Ignore_tid_toolbox_end = 3, Ignore_tid_languages = 4; - private static final Btrie_slim_mgr ignore_trie = Btrie_slim_mgr.ci_ascii_() + private static final Btrie_slim_mgr ignore_trie = Btrie_slim_mgr.ci_a7() .Add_str_byte("SEARCH", Ignore_tid_search) .Add_str_byte("TOOLBOX", Ignore_tid_toolbox) .Add_str_byte("TOOLBOXEND", Ignore_tid_toolbox_end) diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java index e9cb6edb4..f557bfd44 100644 --- a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java @@ -108,7 +108,7 @@ public class Xow_toc_mgr implements Bry_fmtr_arg { bfr.Mkr_rls(); return bfr.Xto_bry_and_clear(); } catch (Exception e) { - Gfo_usr_dlg_.I.Warn_many("", "", "failed to write toc: url=~{0} err=~{1}", page.Url().Xto_full_str_safe(), Err_.Message_gplx_full(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to write toc: url=~{0} err=~{1}", page.Url().To_str(), Err_.Message_gplx_full(e)); return Bry_.Empty; } } diff --git a/400_xowa/src/gplx/xowa/html/utils/Xoh_js_cleaner.java b/400_xowa/src/gplx/xowa/html/utils/Xoh_js_cleaner.java index fe25d066e..d6035b8fd 100644 --- a/400_xowa/src/gplx/xowa/html/utils/Xoh_js_cleaner.java +++ b/400_xowa/src/gplx/xowa/html/utils/Xoh_js_cleaner.java @@ -199,5 +199,5 @@ public class Xoh_js_cleaner { Reg_itm("seekSegmentTime"); ctor = false; } - private void Reg_itm(String s) {trie.Add_bry(Bry_.new_a7(s));} Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:javascript event name + private void Reg_itm(String s) {trie.Add_bry(Bry_.new_a7(s));} Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:javascript event name } diff --git a/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_bldr.java b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_bldr.java index 146dcc617..fa524c7df 100644 --- a/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_bldr.java +++ b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_bldr.java @@ -18,12 +18,12 @@ along with this program. If not, see . package gplx.xowa.html.wtrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.html.*; import gplx.xowa.html.hrefs.*; public class Xoh_lnki_bldr { - private final Xoa_app app; private final Xoh_href_parser href_parser; private final byte[] img_root_dir; + private final Xoa_app app; private final Xoh_href_wtr href_wtr; private final byte[] img_root_dir; private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private byte[] href, title, id, caption; private byte[] img_rel_path; private int img_w, img_h; private boolean img_pos_is_left; - public Xoh_lnki_bldr(Xoa_app app, Xoh_href_parser href_parser) { - this.app = app; this.href_parser = href_parser; + public Xoh_lnki_bldr(Xoa_app app, Xoh_href_wtr href_wtr) { + this.app = app; this.href_wtr = href_wtr; this.img_root_dir = app.Fsys_mgr().Root_dir().GenSubDir_nest("user", "anonymous", "app", "img").To_http_file_bry(); } public Xoh_lnki_bldr Clear() { @@ -35,7 +35,7 @@ public class Xoh_lnki_bldr { public Xoh_lnki_bldr Id_(byte[] v) {this.id = Html_utl.Escape_for_atr_val_as_bry(tmp_bfr, Byte_ascii.Apos, v); return this;} public Xoh_lnki_bldr Href_(Xow_wiki wiki, byte[] bry) {return Href_(wiki.Domain_bry(), wiki.Ttl_parse(bry));} public Xoh_lnki_bldr Href_(byte[] domain_bry, Xoa_ttl ttl) { - href_parser.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); + href_wtr.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); this.href = tmp_bfr.Xto_bry_and_clear(); return this; } diff --git a/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java index f7eabbd59..c5b2e63a9 100644 --- a/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java +++ b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java @@ -18,14 +18,14 @@ along with this program. If not, see . package gplx.xowa.html.wtrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.html.*; import gplx.xowa.html.hrefs.*; public class Xoh_lnki_wtr_utl { - private final Xoa_app app; private final Xow_wiki wiki; private final Xoh_href_parser href_parser; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); - public Xoh_lnki_wtr_utl(Xow_wiki wiki, Xoh_href_parser href_parser) { + private final Xoa_app app; private final Xow_wiki wiki; private final Xoh_href_wtr href_wtr; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + public Xoh_lnki_wtr_utl(Xow_wiki wiki, Xoh_href_wtr href_wtr) { this.app = wiki.App(); - this.wiki = wiki; this.href_parser = href_parser; + this.wiki = wiki; this.href_wtr = href_wtr; } public byte[] Bld_href(byte[] page) {return Bld_href(wiki.Domain_bry(), wiki.Ttl_parse(page));} public byte[] Bld_href(byte[] domain_bry, Xoa_ttl ttl) { - href_parser.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); + href_wtr.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); return tmp_bfr.Xto_bry_and_clear(); } public byte[] Bld_title(byte[] text) { diff --git a/400_xowa/src/gplx/xowa/langs/Xoa_lang_mgr.java b/400_xowa/src/gplx/xowa/langs/Xoa_lang_mgr.java index 5e1b8616b..18b50432e 100644 --- a/400_xowa/src/gplx/xowa/langs/Xoa_lang_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/Xoa_lang_mgr.java @@ -20,7 +20,7 @@ import gplx.intl.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.bldrs.langs.*; import gplx.xowa.langs.vnts.*; public class Xoa_lang_mgr implements GfoInvkAble { private final Xoa_fsys_mgr fsys_mgr; private final Gfo_msg_log msg_log; private final Xol_lang lang_en; - private final Ordered_hash hash = Ordered_hash_.new_bry_(); private final Hash_adp_bry fallback_regy = Hash_adp_bry.cs_(); + private final Ordered_hash hash = Ordered_hash_.new_bry_(); private final Hash_adp_bry fallback_regy = Hash_adp_bry.cs(); public Xoa_lang_mgr(Xoae_app app) { this.fsys_mgr = app.Fsys_mgr(); this.msg_log = app.Msg_log(); mw_converter = new Xobc_utl_make_lang(this, fsys_mgr, msg_log); diff --git a/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java b/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java index e93af8418..eeb538dd5 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java @@ -20,7 +20,7 @@ import gplx.core.btries.*; import gplx.intl.*; import gplx.xowa.xtns.pfuncs.*; public class Xol_func_name_regy { private final Xoa_lang_mgr lang_mgr; private final Xol_lang lang; private final Xol_func_name_itm finder = new Xol_func_name_itm(); - private final Btrie_slim_mgr cs_trie = Btrie_slim_mgr.cs_(), ci_trie = Btrie_slim_mgr.ci_utf_8_(); + private final Btrie_slim_mgr cs_trie = Btrie_slim_mgr.cs(), ci_trie = Btrie_slim_mgr.ci_u8(); public Xol_func_name_regy(Xoa_lang_mgr lang_mgr, Xol_lang lang) {this.lang_mgr = lang_mgr; this.lang = lang;} public void Evt_lang_changed(Xol_lang lang) { Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr(); diff --git a/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java b/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java index 092337b21..38c9eaf7e 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java @@ -466,7 +466,7 @@ public class Xol_lang_itm_ { public static Hash_adp_bry Regy() { if (regy == null) { // NOTE: any parenthetical String below will have an "unseen" character of "\xE2\x80\xAA" at the begining and "\xE2\x80\xAC" at the end. They are responsible for parentheses-orientation in RTL langs. -regy = Hash_adp_bry.ci_ascii_(); // ASCII:lang_code; NOTE: must be ci; EX: {{#languages:FR}} +regy = Hash_adp_bry.ci_a7(); // ASCII:lang_code; NOTE: must be ci; EX: {{#languages:FR}} Regy_add(regy, Id_en, "en", "English"); Regy_add(regy, Id_aa, "aa", "Qafár af"); Regy_add(regy, Id_ab, "ab", "Аҧсуа"); diff --git a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java index 2edd90ab2..ec0d89815 100644 --- a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java +++ b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java @@ -19,10 +19,10 @@ package gplx.xowa.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xo import gplx.intl.*; public class Xol_case_mgr_ { @gplx.Internal protected static Xol_case_mgr new_() {return new Xol_case_mgr(Gfo_case_mgr_.Tid_custom);} - public static Xol_case_mgr Ascii() {if (mgr_ascii == null) mgr_ascii = new_mgr_ascii_(); return mgr_ascii;} private static Xol_case_mgr mgr_ascii; - public static Xol_case_mgr Utf8() {if (mgr_utf8 == null) mgr_utf8 = new_mgr_utf8_(); return mgr_utf8;} private static Xol_case_mgr mgr_utf8; - private static Xol_case_mgr new_mgr_ascii_() { - Xol_case_mgr rv = new Xol_case_mgr(Gfo_case_mgr_.Tid_ascii); + public static Xol_case_mgr A7() {if (mgr_a7 == null) mgr_a7 = new_mgr_a7_(); return mgr_a7;} private static Xol_case_mgr mgr_a7; + public static Xol_case_mgr U8() {if (mgr_u8 == null) mgr_u8 = new_mgr_u8_(); return mgr_u8;} private static Xol_case_mgr mgr_u8; + private static Xol_case_mgr new_mgr_a7_() { + Xol_case_mgr rv = new Xol_case_mgr(Gfo_case_mgr_.Tid_a7); Xol_case_itm[] itms = new Xol_case_itm[] { Xol_case_itm_.new_(0, "a", "A") , Xol_case_itm_.new_(0, "b", "B") @@ -54,8 +54,8 @@ public class Xol_case_mgr_ { rv.Add_bulk(itms); return rv; } - private static Xol_case_mgr new_mgr_utf8_() { - Xol_case_mgr rv = new Xol_case_mgr(Gfo_case_mgr_.Tid_utf8); + private static Xol_case_mgr new_mgr_u8_() { + Xol_case_mgr rv = new Xol_case_mgr(Gfo_case_mgr_.Tid_u8); Xol_case_itm[] itms = new Xol_case_itm[] { Xol_case_itm_.new_(Xol_case_itm_.Tid_both, Bry_.ints_(97), Bry_.ints_(65)) // a -> A -- LATIN CAPITAL LETTER A , Xol_case_itm_.new_(Xol_case_itm_.Tid_both, Bry_.ints_(98), Bry_.ints_(66)) // b -> B -- LATIN CAPITAL LETTER B diff --git a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_tst.java b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_tst.java index fce029365..5c12080e8 100644 --- a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_tst.java @@ -70,7 +70,7 @@ class Xol_case_mgr_fxt { return this; } public Xol_case_mgr_fxt Init_ltrs_universal() { - case_mgr = Xol_case_mgr_.Utf8(); + case_mgr = Xol_case_mgr_.U8(); return this; } public Xol_case_mgr_fxt Upper(String raw_str, String expd) {return Case_build(Bool_.Y, raw_str, expd);} diff --git a/400_xowa/src/gplx/xowa/langs/cnvs/Xol_mw_parse_tst.java b/400_xowa/src/gplx/xowa/langs/cnvs/Xol_mw_parse_tst.java index dc7fdd772..c5f563300 100644 --- a/400_xowa/src/gplx/xowa/langs/cnvs/Xol_mw_parse_tst.java +++ b/400_xowa/src/gplx/xowa/langs/cnvs/Xol_mw_parse_tst.java @@ -119,7 +119,7 @@ class Xol_mw_parse_fxt { private Xol_mw_parse_grp Parse_grp(Php_line_assign line) { Xol_mw_parse_grp grp = new Xol_mw_parse_grp(); byte[] key = line.Key().Val_obj_bry(); // EX: "zh2Hant" - key = Bry_.Lower_ascii(key); // EX: "zh2hant" + key = Bry_.Lcase__all(key); // EX: "zh2hant" byte[][] parts = Bry_.Split(key, Byte_ascii.Num_2); // EX: "zh", "hant" byte[] src = parts[0]; byte[] trg = Bry_.Add(parts[0], new byte[] {Byte_ascii.Dash}, parts[1]); 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 22a384192..4b445fde0 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 @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.langs.durations; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; public class Xol_duration_itm_ { - private static final Hash_adp_bry regy = Hash_adp_bry.ci_ascii_(); // ASCII:MW.consts + private static final Hash_adp_bry regy = Hash_adp_bry.ci_a7(); // ASCII:MW.consts public static final byte Tid_millenia = 0 , Tid_centuries = 1 diff --git a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java index ef560ce23..af6e8bf36 100644 --- a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java +++ b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.btries.*; public class Xol_grammar_ { public static final byte Tid__max = 9; public static final byte Tid_genitive = 0, Tid_elative = 1, Tid_partitive = 2, Tid_illative = 3, Tid_inessive = 4, Tid_accusative = 5, Tid_instrumental = 6, Tid_prepositional = 7, Tid_dative = 8, Tid_unknown = Byte_.Max_value_127; - private static final Btrie_slim_mgr Tid_trie = Btrie_slim_mgr.ci_ascii_() // NOTE:ci.ascii:MW kwds + private static final Btrie_slim_mgr Tid_trie = Btrie_slim_mgr.ci_a7() // NOTE:ci.ascii:MW kwds .Add_str_byte("genitive", Tid_genitive) .Add_str_byte("elative", Tid_elative) .Add_str_byte("partitive", Tid_partitive) diff --git a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_fi.java b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_fi.java index ef1a64d2a..e76dd0e29 100644 --- a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_fi.java +++ b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_fi.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.core.primitives.*; import gplx.core.btries.*; +import gplx.xowa.urls.*; public class Xol_grammar_fi implements Xol_grammar { public boolean Vowel_harmony(byte[] word, int word_len) { // $aou = preg_match( '/[aou][^äöy]*$/i', $word ); @@ -53,7 +54,7 @@ public class Xol_grammar_fi implements Xol_grammar { byte[] lower = lang.Case_mgr().Case_build_lower(word, 0, word_len); boolean aou = Vowel_harmony(lower, word_len); // PHP: if ( preg_match( '/wiki$/i', $word ) ) $aou = false; - if (aou && Bry_.Has_at_end(lower, Xoa_url_parser.Bry_wiki_name)) + if (aou && Bry_.Has_at_end(lower, Bry_wiki)) aou = false; // PHP: if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) ) $word .= 'i'; switch (lower[word_len - 1]) { @@ -76,5 +77,6 @@ public class Xol_grammar_fi implements Xol_grammar { } static Xol_grammar_manual_regy manual_regy; private static final byte[] Bry_sta_y = Bry_.new_a7("sta"), Bry_sta_n = Bry_.new_u8("stä"), Bry_a_y = Bry_.new_a7("a"), Bry_a_n = Bry_.new_u8("ä"), Bry_ssa_y = Bry_.new_a7("ssa"), Bry_ssa_n = Bry_.new_u8("ssä"); static final byte Trie_vh_back = 0, Trie_vh_front = 1; - private static Btrie_slim_mgr trie_vh = Btrie_slim_mgr.cs_().Add_str_byte__many(Trie_vh_back, "a", "o", "u").Add_str_byte__many(Trie_vh_front, "ä", "ö", "y"); + private static Btrie_slim_mgr trie_vh = Btrie_slim_mgr.cs().Add_str_byte__many(Trie_vh_back, "a", "o", "u").Add_str_byte__many(Trie_vh_front, "ä", "ö", "y"); + private static final byte[] Bry_wiki = Bry_.new_a7("wiki"); } diff --git a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_manual_regy.java b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_manual_regy.java index ba5b30c05..b35dbfb78 100644 --- a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_manual_regy.java +++ b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_manual_regy.java @@ -25,7 +25,7 @@ public class Xol_grammar_manual_regy { public Xol_grammar_manual_regy Itms_add(byte type_tid, String orig, String repl) { Hash_adp_bry hash = ary[type_tid]; if (hash == null) { - hash = Hash_adp_bry.ci_ascii_(); // ASCII:currently only being used for Wikiuutiset; DATE:2014-07-07 + hash = Hash_adp_bry.ci_a7(); // ASCII:currently only being used for Wikiuutiset; DATE:2014-07-07 ary[type_tid] = hash; } hash.Add_str_obj(orig, Bry_.new_a7(repl)); diff --git a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java index 748bb7f6a..5124e693b 100644 --- a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java +++ b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java @@ -23,7 +23,7 @@ public class Xol_num_fmtr_base implements GfoInvkAble { private Gfo_num_fmt_wkr[] cache; int cache_len = 16; private Bry_bfr tmp = Bry_bfr.new_(); public boolean Standard() {return standard;} private boolean standard = true; - public byte[] Dec_dlm() {return dec_dlm;} public Xol_num_fmtr_base Dec_dlm_(byte[] v) {this.dec_dlm = v; dlm_trie.Add_bry_bval(v, Raw_tid_dec); return this;} private byte[] dec_dlm = Dec_dlm_default; + public byte[] Dec_dlm() {return dec_dlm;} public Xol_num_fmtr_base Dec_dlm_(byte[] v) {this.dec_dlm = v; dlm_trie.Add_bry_byte(v, Raw_tid_dec); return this;} private byte[] dec_dlm = Dec_dlm_default; private byte[] grp_dlm; public byte[] Raw(byte tid, byte[] src) { int src_len = src.length; @@ -120,7 +120,7 @@ public class Xol_num_fmtr_base implements GfoInvkAble { byte[] itm_dlm = itm.Dlm(); Object o = dlm_trie.Match_exact(itm_dlm, 0, itm_dlm.length); // check for existing Object if (o == null) { - dlm_trie.Add_bry_bval(itm_dlm, Raw_tid_grp); + dlm_trie.Add_bry_byte(itm_dlm, Raw_tid_grp); grp_dlm = itm_dlm; } } diff --git a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_mgr.java b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_mgr.java index 07840e091..1e6c25c06 100644 --- a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_mgr.java @@ -31,8 +31,9 @@ public class Xol_num_mgr implements GfoInvkAble { return num; } public byte[] Format_num_no_separators(byte[] num) {return Format_num(num, true);} - public byte[] Format_num(int val) {return Format_num(Bry_.new_a7(Int_.Xto_str(val)));} - public byte[] Format_num(byte[] num) {return Format_num(num, false);} + public byte[] Format_num_by_long(long val) {return Format_num(Bry_.new_a7(Long_.Xto_str(val)));} + public byte[] Format_num(int val) {return Format_num(Bry_.new_a7(Int_.Xto_str(val)));} + public byte[] Format_num(byte[] num) {return Format_num(num, false);} public byte[] Format_num(byte[] num, boolean skip_commafy) { if (!skip_commafy) { num = Commafy(num); diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp.java b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp.java index 4e59fe515..3e2554ef5 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp.java @@ -17,9 +17,10 @@ along with this program. If not, see . */ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; public class Vnt_mnu_grp { - private final List_adp list = List_adp_.new_(); + private final Ordered_hash list = Ordered_hash_.new_bry_(); public int Len() {return list.Count();} + public boolean Has(byte[] key) {return list.Has(key);} public Vnt_mnu_itm Get_at(int i) {return (Vnt_mnu_itm)list.Get_at(i);} - public void Add(Vnt_mnu_itm itm) {list.Add(itm);} - public byte[] Text() {return text;} public void Text_(byte[] v) {text = v;} private byte[] text; + public void Add(Vnt_mnu_itm itm) {list.Add_if_dupe_use_1st(itm.Key(), itm);} + public Vnt_mnu_itm Get_by(byte[] key) {return (Vnt_mnu_itm)list.Get_by(key);} } diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr.java b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr.java index 943ab9f1a..fb89225cc 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr.java @@ -17,14 +17,15 @@ along with this program. If not, see . */ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; public class Vnt_mnu_grp_fmtr implements Bry_fmtr_arg { - private Vnt_mnu_grp grp; private final Xolg_vnt_itm_fmtr itm_fmtr = new Xolg_vnt_itm_fmtr(); - public void Init(Vnt_mnu_grp grp, byte[] page_href, byte[] page_vnt) { - this.grp = grp; - itm_fmtr.Init(grp, page_href, page_vnt); + private Vnt_mnu_grp grp; private byte[] page_vnt; + public void Init(Vnt_mnu_grp grp, byte[] wiki_domain, byte[] page_href, byte[] page_vnt) { + this.grp = grp; this.page_vnt = page_vnt; + itm_fmtr.Init(grp, wiki_domain, page_href, page_vnt); } public void XferAry(Bry_bfr bfr, int idx) { - fmtr.Bld_bfr_many(bfr, grp.Text(), itm_fmtr); + Vnt_mnu_itm mnu_itm = grp.Get_by(page_vnt); + fmtr.Bld_bfr_many(bfr, mnu_itm == null ? Bry_.Empty : mnu_itm.Text(), itm_fmtr); } private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" @@ -39,21 +40,21 @@ public class Vnt_mnu_grp_fmtr implements Bry_fmtr_arg { ); } class Xolg_vnt_itm_fmtr implements Bry_fmtr_arg { - private Vnt_mnu_grp grp; private byte[] page_href, page_vnt; - public void Init(Vnt_mnu_grp grp, byte[] page_href, byte[] page_vnt) {this.grp = grp; this.page_href = page_href; this.page_vnt = page_vnt;} + private Vnt_mnu_grp grp; private byte[] wiki_domain, page_href, page_vnt; + public void Init(Vnt_mnu_grp grp, byte[] wiki_domain, byte[] page_href, byte[] page_vnt) {this.grp = grp; this.wiki_domain = wiki_domain; this.page_href = page_href; this.page_vnt = page_vnt;} public void XferAry(Bry_bfr bfr, int idx) { int len = grp.Len(); for (int i = 0; i < len; ++i) { Vnt_mnu_itm itm = grp.Get_at(i); boolean itm_is_selected = Bry_.Eq(itm.Key(), page_vnt); byte[] itm_cls_selected = itm_is_selected ? Itm_cls_selected_y : Bry_.Empty; - fmtr.Bld_bfr_many(bfr, i, itm_cls_selected, itm.Key(), itm.Text(), page_href); + fmtr.Bld_bfr_many(bfr, i, itm_cls_selected, wiki_domain, itm.Key(), itm.Text(), page_href); } } private static final byte[] Itm_cls_selected_y = Bry_.new_a7(" class='selected'"); - private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last // NOTE: using "/site/zh.w/zh-hans/A" instead of "/zh-hans/A" b/c it is easier for href_parser; if /site/ ever needs to truly mean "not-this-site", then change this to "/lang/"; DATE:2015-07-30 ( "" - , "
  • ~{itm_text}
  • " - ), "itm_idx", "itm_cls_selected", "itm_lang", "itm_text", "itm_href" + , "
  • ~{itm_text}
  • " + ), "itm_idx", "itm_cls_selected", "wiki_domain", "itm_lang", "itm_text", "itm_href" ); } diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr_tst.java b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr_tst.java index bf97e2f96..5dfc109a5 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Vnt_mnu_grp_fmtr_tst.java @@ -20,23 +20,23 @@ import org.junit.*; public class Vnt_mnu_grp_fmtr_tst { @Before public void init() {fxt.Clear();} private final Vnt_mnu_grp_fmtr_fxt fxt = new Vnt_mnu_grp_fmtr_fxt(); @Test public void Basic() { - fxt.Test_to_str("Earth", "zh-hk", String_.Concat_lines_nl_skip_last - ( "" - , " " - )); +// fxt.Test_to_str("Earth", "zh-hk", String_.Concat_lines_nl_skip_last +// ( "" +// , " " +// )); } } class Vnt_mnu_grp_fmtr_fxt { @@ -46,7 +46,6 @@ class Vnt_mnu_grp_fmtr_fxt { } public void Init_grp(String text, String... langs) { vnt_grp = new Vnt_mnu_grp(); - vnt_grp.Text_(Bry_.new_u8(text)); int len = langs.length; String lang_code = ""; for (int i = 0; i < len; ++i) { @@ -62,7 +61,7 @@ class Vnt_mnu_grp_fmtr_fxt { public void Test_to_str(String page_href, String selected_vnt, String expd) { Vnt_mnu_grp_fmtr vnt_grp_fmtr = new Vnt_mnu_grp_fmtr(); Bry_bfr bfr = Bry_bfr.new_(); - vnt_grp_fmtr.Init(vnt_grp, Bry_.new_u8(page_href), Bry_.new_u8(selected_vnt)); + vnt_grp_fmtr.Init(vnt_grp, Bry_.new_u8(page_href), Bry_.new_a7("zh.wikipedia.org"), Bry_.new_u8(selected_vnt)); vnt_grp_fmtr.XferAry(bfr, 0); Tfds.Eq_str_lines(expd, bfr.Xto_str_and_clear()); } diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_converter.java b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_converter.java index 067c20cd3..eb9faa97b 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_converter.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_converter.java @@ -19,7 +19,7 @@ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.core.btries.*; import gplx.intl.*; import gplx.xowa.langs.cnvs.*; public class Xol_vnt_converter { - private Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + private Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); public Xol_vnt_converter(Xol_vnt_itm owner) {this.owner = owner;} public byte[] Owner_key() {return owner.Key();} public Xol_vnt_itm Owner() {return owner;} private Xol_vnt_itm owner; @@ -49,6 +49,7 @@ public class Xol_vnt_converter { pos = trie.Match_pos(); } } + if (!matched) bfr.Add(src); // no convert; make sure to add back src, else bfr will be blank return matched; } public void Rebuild() {Clear(); Build();} diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java index df22820d7..fa73d2c96 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java @@ -27,12 +27,11 @@ public class Xol_vnt_mgr implements GfoInvkAble { public Vnt_mnu_grp_fmtr Vnt_mnu_fmtr() {return vnt_mnu_fmtr;} private final Vnt_mnu_grp_fmtr vnt_mnu_fmtr = new Vnt_mnu_grp_fmtr(); public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {this.enabled = v;} private boolean enabled = false; public byte[] Cur_vnt() {return cur_vnt;} private byte[] cur_vnt = Bry_.Empty; - private void Vnt_grp_(byte[][] ary) { + public void Vnt_grp_(byte[][] ary) { int len = ary.length; for (int i = 0; i < len; ++i) { byte[] vnt = ary[i]; byte[] msg = lang.Msg_mgr().Itm_by_key_or_new(Bry_.Add(Msg_variantname, vnt)).Val(); -// byte[] msg = vnt; vnt_grp.Add(new Vnt_mnu_itm(vnt, msg)); } } @@ -47,7 +46,7 @@ public class Xol_vnt_mgr implements GfoInvkAble { break; } } - if (new_converter_ary_idx == -1) throw Err_.new_("lang.vnt", "uknown vnt", "key", v); + if (new_converter_ary_idx == -1) throw Err_.new_("lang.vnt", "unknown vnt", "key", v); this.cur_vnt = v; this.cur_converter_ary_idx = new_converter_ary_idx; return this; @@ -90,14 +89,16 @@ public class Xol_vnt_mgr implements GfoInvkAble { return rv; } public Xowd_page_itm Convert_ttl(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { // REF.MW:LanguageConverter.php|findVariantLink - int converted = Convert_ttl__convert_each_vnt(wiki, tmp_bfr, ns, ttl_bry); // convert ttl for each vnt - if (converted == 0) return Xowd_page_itm.Null; // ttl_bry has no conversions; exit; - wiki.Db_mgr().Load_mgr().Load_by_ttls(Cancelable_.Never, tmp_page_list, true, 0, converted); - for (int i = 0; i < converted; i++) { - Xowd_page_itm page = (Xowd_page_itm)tmp_page_list.Get_at(i); - if (page.Exists()) return page; // return 1st found page + synchronized (tmp_page_list) { + int converted = Convert_ttl__convert_each_vnt(wiki, tmp_bfr, ns, ttl_bry); // convert ttl for each vnt + if (converted == 0) return Xowd_page_itm.Null; // ttl_bry has no conversions; exit; + wiki.Db_mgr().Load_mgr().Load_by_ttls(Cancelable_.Never, tmp_page_list, true, 0, converted); + for (int i = 0; i < converted; i++) { + Xowd_page_itm page = (Xowd_page_itm)tmp_page_list.Get_at(i); + if (page.Exists()) return page; // return 1st found page + } + return Xowd_page_itm.Null; } - return Xowd_page_itm.Null; } private int Convert_ttl__convert_each_vnt(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { synchronized (tmp_page_list) { diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_lang_bldr.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_lang_bldr.java index 5803b2414..28ef3a04c 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_lang_bldr.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_lang_bldr.java @@ -31,7 +31,7 @@ class Xop_vnt_flag_lang_bldr { ary = new Xop_vnt_flag_lang_itm[len]; ary_len = len; } - public Btrie_slim_mgr Trie() {return trie;} private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:MW_const.en; lang variant name; EX:zh-hans + public Btrie_slim_mgr Trie() {return trie;} private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; lang variant name; EX:zh-hans public void Add(Xop_vnt_flag_lang_itm itm) { int idx = itm.Idx(); if (ary[idx] == null) { diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java index 3d315297f..136944b97 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java @@ -101,11 +101,11 @@ class Xop_vnt_flag_parser { private static Btrie_fast_mgr flag_trie = Xop_vnt_flag_.Trie; // private static final byte Dlm_tid_bgn = 0, Dlm_tid_end = 1, Dlm_tid_pipe = 2, Dlm_tid_colon = 3, Dlm_tid_semic = 4, Dlm_tid_kv = 5; // private static Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs_() -// .Add_bry_bval(Xop_vnt_lxr_.Hook_bgn , Dlm_tid_bgn) -// .Add_bry_bval(Xop_vnt_lxr_.Hook_end , Dlm_tid_end) -// .Add_bry_bval(Byte_ascii.Pipe , Dlm_tid_pipe) -// .Add_bry_bval(Byte_ascii.Colon , Dlm_tid_colon) -// .Add_bry_bval(Byte_ascii.Semic , Dlm_tid_semic) -// .Add_bry_bval(Bry_.new_a7("=>") , Dlm_tid_kv) +// .Add_bry_byte(Xop_vnt_lxr_.Hook_bgn , Dlm_tid_bgn) +// .Add_bry_byte(Xop_vnt_lxr_.Hook_end , Dlm_tid_end) +// .Add_bry_byte(Byte_ascii.Pipe , Dlm_tid_pipe) +// .Add_bry_byte(Byte_ascii.Colon , Dlm_tid_colon) +// .Add_bry_byte(Byte_ascii.Semic , Dlm_tid_semic) +// .Add_bry_byte(Bry_.new_a7("=>") , Dlm_tid_kv) // ; } diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_rules_parser.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_rules_parser.java index c7b459f3a..a31d8c4c1 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_rules_parser.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_rules_parser.java @@ -33,7 +33,7 @@ class Xop_vnt_rules_parser { private byte[] cur_macro_bry = null; private byte[] cur_lang_bry = null; public Xop_vnt_rules_parser(Xol_vnt_mgr vnt_mgr) { - trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:MW_const.en; lang variant name; EX:zh-hans + trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; lang variant name; EX:zh-hans Xol_vnt_converter[] ary = vnt_mgr.Converter_ary(); int ary_len = ary.length; for (int i = 0; i < ary_len; i++) { 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 5ea7c4021..e642ee8b6 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 @@ -76,46 +76,49 @@ public class Xop_amp_mgr { int src_len = src.length; boolean dirty = false; int pos = 0; - while (pos < src_len) { - byte b = src[pos]; - if (b == Byte_ascii.Amp) { - int nxt_pos = pos + 1; - if (nxt_pos < src_len) { - byte nxt_b = src[nxt_pos]; - Object amp_obj = amp_trie.Match_bgn_w_byte(nxt_b, src, nxt_pos, src_len); - if (amp_obj != null) { - if (!dirty) { - tmp_bfr.Add_mid(src, 0, pos); - dirty = true; + synchronized (tmp_bfr) { + while (pos < src_len) { + byte b = src[pos]; + if (b == Byte_ascii.Amp) { + int nxt_pos = pos + 1; + if (nxt_pos < src_len) { + byte nxt_b = src[nxt_pos]; + Object amp_obj = amp_trie.Match_bgn_w_byte(nxt_b, src, nxt_pos, src_len); + if (amp_obj != null) { + if (!dirty) { + tmp_bfr.Add_mid(src, 0, pos); + dirty = true; + } + Xop_amp_trie_itm amp_itm = (Xop_amp_trie_itm)amp_obj; + switch (amp_itm.Tid()) { + case Xop_amp_trie_itm.Tid_name_std: + case Xop_amp_trie_itm.Tid_name_xowa: + tmp_bfr.Add(amp_itm.U8_bry()); + pos = amp_trie.Match_pos(); + break; + case Xop_amp_trie_itm.Tid_num_hex: + case Xop_amp_trie_itm.Tid_num_dec: + boolean ncr_is_hex = amp_itm.Tid() == Xop_amp_trie_itm.Tid_num_hex; + int int_bgn = amp_trie.Match_pos(); + if (Parse_as_int(ncr_is_hex, src, src_len, pos, int_bgn)) + tmp_bfr.Add_u8_int(rslt_val); + else + tmp_bfr.Add_mid(src, pos, nxt_pos); + pos = rslt_pos; + break; + default: + throw Err_.new_unhandled(amp_itm.Tid()); + } + continue; } - Xop_amp_trie_itm amp_itm = (Xop_amp_trie_itm)amp_obj; - switch (amp_itm.Tid()) { - case Xop_amp_trie_itm.Tid_name_std: - case Xop_amp_trie_itm.Tid_name_xowa: - tmp_bfr.Add(amp_itm.Utf8_bry()); - pos = amp_trie.Match_pos(); - break; - case Xop_amp_trie_itm.Tid_num_hex: - case Xop_amp_trie_itm.Tid_num_dec: - boolean ncr_is_hex = amp_itm.Tid() == Xop_amp_trie_itm.Tid_num_hex; - int int_bgn = amp_trie.Match_pos(); - if (Parse_as_int(ncr_is_hex, src, src_len, pos, int_bgn)) - tmp_bfr.Add_u8_int(rslt_val); - else - tmp_bfr.Add_mid(src, pos, nxt_pos); - pos = rslt_pos; - break; - default: - throw Err_.new_unhandled(amp_itm.Tid()); - } - continue; - } - } + } + } + if (dirty) + tmp_bfr.Add_byte(b); + ++pos; } - if (dirty) - tmp_bfr.Add_byte(b); - ++pos; + return dirty ? tmp_bfr.Xto_bry_and_clear() : src; } - return dirty ? tmp_bfr.Xto_bry_and_clear() : src; } + public static final Xop_amp_mgr I = new Xop_amp_mgr(); Xop_amp_mgr() {} } diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java index 7dcbffb13..69ff01443 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java @@ -36,7 +36,7 @@ public class Xop_amp_mgr_decode_tst { @Test public void Num_ignore_extra_x() {fxt.Test_decode_as_bry("&#xx26D0;" , Char_.XtoStr(Char_.XbyInt(9936)));} // 2nd x is ignored } class Xop_amp_mgr_fxt { - private Xop_amp_mgr amp_mgr = new Xop_amp_mgr(); + private Xop_amp_mgr amp_mgr = Xop_amp_mgr.I; public void Reset() {} public void Test_decode_as_bry(String raw, String expd) { Tfds.Eq(expd, String_.new_u8(amp_mgr.Decode_as_bry(Bry_.new_u8(raw)))); diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java index 8e01d832f..7d91d6bde 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java @@ -33,7 +33,7 @@ public class Xop_amp_trie { ; public static final Btrie_slim_mgr _ = new_(); Xop_amp_trie() {} private static Btrie_slim_mgr new_() {// REF.MW: Sanitizer|$wgHtmlEntities; NOTE:added apos - Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.cs(); Reg_name(rv, Bool_.Y, 60, Bry_xowa_lt); Reg_name(rv, Bool_.Y, 91, Bry_xowa_brack_bgn); Reg_name(rv, Bool_.Y, 93, Bry_xowa_brack_end); diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java index a4cb4b656..39955b925 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java @@ -21,13 +21,13 @@ public class Xop_amp_trie_itm { public Xop_amp_trie_itm(byte tid, int char_int, byte[] xml_name_bry) { this.tid = tid; this.char_int = char_int; - this.utf8_bry = gplx.intl.Utf16_.Encode_int_to_bry(char_int); + this.u8_bry = gplx.intl.Utf16_.Encode_int_to_bry(char_int); this.xml_name_bry = xml_name_bry; this.key_name_len = xml_name_bry.length - 2; // 2 for & and ; } public byte Tid() {return tid;} private final byte tid; public int Char_int() {return char_int;} private final int char_int; // val; EX: 160 - public byte[] Utf8_bry() {return utf8_bry;} private final byte[] utf8_bry; // EX: new byte[] {192, 160}; (C2, A0) + public byte[] U8_bry() {return u8_bry;} private final byte[] u8_bry; // EX: new byte[] {192, 160}; (C2, A0) public byte[] Xml_name_bry() {return xml_name_bry;} private final byte[] xml_name_bry; // EX: " " public int Key_name_len() {return key_name_len;} private final int key_name_len; // EX: "nbsp".Len public void Print_ncr(Bry_bfr bfr) { @@ -49,7 +49,7 @@ public class Xop_amp_trie_itm { case Byte_ascii.Quote: bfr.Add(Html_entity_.Quote_bry); break; case Byte_ascii.Amp: bfr.Add(Html_entity_.Amp_bry); break; default: - bfr.Add(utf8_bry); // write literal; EX: "[" not "[" + bfr.Add(u8_bry); // write literal; EX: "[" not "[" break; } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java index 4c24638c7..453976373 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java @@ -16,13 +16,14 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.core.net.*; import gplx.xowa.html.*; import gplx.xowa.html.hrefs.*; -import gplx.xowa.net.*; +import gplx.xowa.urls.*; public class Xoh_lnke_wtr { - private Xoae_app app; - public Xoh_lnke_wtr(Xowe_wiki wiki) {this.app = wiki.Appe();} +// private Xoae_app app; + public Xoh_lnke_wtr(Xowe_wiki wiki) {}// this.app = wiki.Appe();} public void Write_all(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) { - int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); boolean proto_is_xowa = lnke.Proto_tid() == Xoo_protocol_itm.Tid_xowa; + int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa; if (!hctx.Mode_is_alt()) { // write href, unless mode is alt if (hctx.Mode_is_hdump()) { if (lnke.Lnke_typ() == Xop_lnke_tkn.Lnke_typ_text) @@ -52,7 +53,7 @@ public class Xoh_lnke_wtr { byte[] lnke_xwiki_wiki = lnke.Lnke_xwiki_wiki(); if (lnke_xwiki_wiki == null) { if (lnke.Lnke_relative()) { // relative; EX: //a.org - bfr.Add(app.Utl__url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end); + bfr.Add(ctx.Wiki().Utl__url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end); return true; } else { // xowa or regular; EX: http://a.org @@ -69,10 +70,10 @@ public class Xoh_lnke_wtr { } else { // xwiki Url_encoder href_encoder = Xoa_app_.Utl__encoder_mgr().Href_quotes(); - bfr.Add(Xoh_href_parser.Href_site_bry).Add(lnke_xwiki_wiki).Add(Xoh_href_parser.Href_wiki_bry) + bfr.Add(Xoh_href_.Bry__site).Add(lnke_xwiki_wiki).Add(Xoh_href_.Bry__wiki) .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, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args + Gfo_qarg_mgr.Concat_bfr(bfr, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args return false; } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_lxr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_lxr.java index 2f2d1b899..4cd406f5e 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_lxr.java @@ -16,20 +16,20 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.core.btries.*; import gplx.xowa.net.*; +import gplx.core.btries.*; import gplx.core.net.*; public class Xop_lnke_lxr implements Xop_lxr { Xop_lnke_lxr(byte lnke_typ, byte[] protocol, byte tid) {this.lnke_typ = lnke_typ; this.protocol = protocol; this.tid = tid;} private byte lnke_typ; byte[] protocol; byte tid; public byte Lxr_tid() {return Xop_lxr_.Tid_lnke_bgn;} public void Init_by_wiki(Xowe_wiki wiki, Btrie_fast_mgr core_trie) { - Xoo_protocol_itm[] ary = Xoo_protocol_itm.Ary(); + Gfo_protocol_itm[] ary = Gfo_protocol_itm.Ary(); int ary_len = ary.length; for (int i = 0; i < ary_len; i++) { - Xoo_protocol_itm itm = ary[i]; + Gfo_protocol_itm itm = ary[i]; Ctor_lxr_add(core_trie, itm.Key_w_colon_bry(), itm.Tid()); } - core_trie.Add(Bry_relative_1, new Xop_lnke_lxr(Xop_lnke_tkn.Lnke_typ_brack, Xoa_consts.Url_relative_prefix, Xoo_protocol_itm.Tid_relative_1)); - core_trie.Add(Bry_relative_2, new Xop_lnke_lxr(Xop_lnke_tkn.Lnke_typ_brack, Xoa_consts.Url_relative_prefix, Xoo_protocol_itm.Tid_relative_2)); - Ctor_lxr_add(core_trie, Bry_.new_a7("xowa-cmd"), Xoo_protocol_itm.Tid_xowa); + core_trie.Add(Bry_relative_1, new Xop_lnke_lxr(Xop_lnke_tkn.Lnke_typ_brack, Xoa_consts.Url_relative_prefix, Gfo_protocol_itm.Tid_relative_1)); + core_trie.Add(Bry_relative_2, new Xop_lnke_lxr(Xop_lnke_tkn.Lnke_typ_brack, Xoa_consts.Url_relative_prefix, Gfo_protocol_itm.Tid_relative_2)); + Ctor_lxr_add(core_trie, Bry_.new_a7("xowa-cmd"), Gfo_protocol_itm.Tid_xowa); } private static final byte[] Bry_relative_1 = Bry_.new_a7("[//"), Bry_relative_2 = Bry_.new_a7("[[//"); public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {} private void Ctor_lxr_add(Btrie_fast_mgr core_trie, byte[] protocol_bry, byte tid) { @@ -37,7 +37,7 @@ public class Xop_lnke_lxr implements Xop_lxr { core_trie.Add(Bry_.Add(Byte_ascii.Brack_bgn, protocol_bry) , new Xop_lnke_lxr(Xop_lnke_tkn.Lnke_typ_brack, protocol_bry, tid)); } public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) { - if (this.tid == Xoo_protocol_itm.Tid_xowa && !ctx.Wiki().Sys_cfg().Xowa_proto_enabled()) return ctx.Lxr_make_txt_(cur_pos); + if (this.tid == Gfo_protocol_itm.Tid_xowa && !ctx.Wiki().Sys_cfg().Xowa_proto_enabled()) return ctx.Lxr_make_txt_(cur_pos); return ctx.Lnke().MakeTkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, protocol, tid, lnke_typ); } public static final Xop_lnke_lxr _ = new Xop_lnke_lxr(); Xop_lnke_lxr() {} diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_tkn.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_tkn.java index 0f854fa6a..a55e67504 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_tkn.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.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.xowa.parsers.lnkes.*; +import gplx.core.net.*; public class Xop_lnke_tkn extends Xop_tkn_itm_base {//20111222 public static final byte Lnke_typ_null = 0, Lnke_typ_brack = 1, Lnke_typ_text = 2, Lnke_typ_brack_dangling = 3; @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_lnke;} @@ -25,8 +25,8 @@ public class Xop_lnke_tkn extends Xop_tkn_itm_base {//20111222 public byte[] Lnke_site() {return lnke_site;} public Xop_lnke_tkn Lnke_site_(byte[] v) {lnke_site = v; return this;} private byte[] lnke_site; public byte[] Lnke_xwiki_wiki() {return lnke_xwiki_wiki;} private byte[] lnke_xwiki_wiki; public byte[] Lnke_xwiki_page() {return lnke_xwiki_page;} private byte[] lnke_xwiki_page; - public Gfo_url_arg[] Lnke_xwiki_qargs() {return lnke_xwiki_qargs;} Gfo_url_arg[] lnke_xwiki_qargs; - public void Lnke_xwiki_(byte[] wiki, byte[] page, Gfo_url_arg[] args) {this.lnke_xwiki_wiki = wiki; this.lnke_xwiki_page = page; this.lnke_xwiki_qargs = args;} + public Gfo_qarg_itm[] Lnke_xwiki_qargs() {return lnke_xwiki_qargs;} Gfo_qarg_itm[] lnke_xwiki_qargs; + public void Lnke_xwiki_(byte[] wiki, byte[] page, Gfo_qarg_itm[] args) {this.lnke_xwiki_wiki = wiki; this.lnke_xwiki_page = page; this.lnke_xwiki_qargs = args;} public int Lnke_bgn() {return lnke_bgn;} private int lnke_bgn; public int Lnke_end() {return lnke_end;} private int lnke_end; public Xop_lnke_tkn Lnke_rng_(int bgn, int end) {lnke_bgn = bgn; lnke_end = end; return this;} 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 a97b7c26c..f4a8f1f3c 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 @@ -16,9 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.xowa.apps.progs.*; import gplx.xowa.net.*; import gplx.xowa.wikis.xwikis.*; +import gplx.core.net.*; import gplx.xowa.urls.*; +import gplx.xowa.apps.progs.*; import gplx.xowa.wikis.xwikis.*; public class Xop_lnke_wkr implements Xop_ctx_wkr { - public void Ctor_ctx(Xop_ctx ctx) {url_parser = ctx.App().Utl__url_parser().Url_parser();} Gfo_url_parser url_parser; Gfo_url_site_data site_data = new Gfo_url_site_data(); Xoa_url_parser xo_url_parser = new Xoa_url_parser(); Xoa_url xo_url_parser_url = Xoa_url.blank_(); + public void Ctor_ctx(Xop_ctx ctx) {url_parser = ctx.Wiki().Utl__url_parser().Url_parser();} Gfo_url_parser url_parser; Gfo_url_site_data site_data = new Gfo_url_site_data(); + private Xoa_url xo_url_parser_url = Xoa_url.blank(); public void Page_bgn(Xop_ctx ctx, Xop_root_tkn root) {} public void Page_end(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int src_len) {} public boolean Dangling_goes_on_stack() {return dangling_goes_on_stack;} public void Dangling_goes_on_stack_(boolean v) {dangling_goes_on_stack = v;} private boolean dangling_goes_on_stack; @@ -38,7 +40,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { ) return ctx.Lxr_make_txt_(cur_pos - 1); // -1 to ignore ":" in making text colon; needed to process ":" for list like "; attl: b" PAGE:de.w:Mord_(Deutschland)#Besonders_verwerfliche_Begehungsweise; DATE:2015-01-09 if (ctx.Stack_get_typ(Xop_tkn_itm_.Tid_lnke) != null) return ctx.Lxr_make_txt_(cur_pos); // no nested lnke; return cur lnke as text; EX: "[irc://a irc://b]" -> "irc:b" - if (proto_tid == Xoo_protocol_itm.Tid_xowa) return Make_tkn_xowa(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, protocol, proto_tid, lnke_type); + if (proto_tid == Gfo_protocol_itm.Tid_xowa) return Make_tkn_xowa(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, protocol, proto_tid, lnke_type); // HACK: need to disable lnke if enclosing type is lnki and (1) arg is "link=" or (2) in 1st arg; basically, only enable for caption tkns (and preferably, thumb only) (which should be neither 1 or 2) if (ctx.Cur_tkn_tid() == Xop_tkn_itm_.Tid_lnki && lnke_type == Xop_lnke_tkn.Lnke_typ_text) { @@ -129,7 +131,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { lnke_type = Xop_lnke_tkn.Lnke_typ_brack_dangling; return ctx.Lxr_make_txt_(lnke_end); // textify lnk; EX: [irc://a\n] textifies "[irc://a" default: - lnke_bgn += proto_tid == Xoo_protocol_itm.Tid_relative_2 ? 2 : 1; // if Tid_relative_2, then starts with [[; adjust by 2; EX:"[[//en" should have lnke_bgn at "//en", not "[//en" + lnke_bgn += proto_tid == Gfo_protocol_itm.Tid_relative_2 ? 2 : 1; // if Tid_relative_2, then starts with [[; adjust by 2; EX:"[[//en" should have lnke_bgn at "//en", not "[//en" lnke_type = Xop_lnke_tkn.Lnke_typ_brack; break; } @@ -148,7 +150,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { } } } - if (proto_tid == Xoo_protocol_itm.Tid_relative_2) // for "[[//", add "["; rest of code handles "[//" normally, but still want to include literal "["; DATE:2013-02-02 + if (proto_tid == Gfo_protocol_itm.Tid_relative_2) // for "[[//", add "["; rest of code handles "[//" normally, but still want to include literal "["; DATE:2013-02-02 ctx.Subs_add(root, tkn_mkr.Txt(lnke_bgn - 1, lnke_bgn)); url_parser.Parse_site_fast(site_data, src, lnke_bgn, lnke_end); int site_bgn = site_data.Site_bgn(), site_end = site_data.Site_end(); @@ -162,9 +164,12 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { Xop_lnke_tkn tkn = tkn_mkr.Lnke(bgn_pos, brack_end_pos, protocol, proto_tid, lnke_type, lnke_bgn, lnke_end); tkn.Lnke_relative_(site_data.Rel()); Xow_xwiki_itm xwiki = ctx.App().Usere().Wiki().Xwiki_mgr().Get_by_mid(src, site_bgn, site_end); // NOTE: check User_wiki.Xwiki_mgr, not App.Wiki_mgr() b/c only it is guaranteed to know all wikis on system - if (xwiki != null) { // lnke is to an xwiki; EX: [http://en.wikipedia.org/A a] + if ( xwiki != null // lnke is to an xwiki; EX: [http://en.wikipedia.org/A a] + && Byte_.In(proto_tid, Gfo_protocol_itm.Tid_relative_1, Gfo_protocol_itm.Tid_relative_2, Gfo_protocol_itm.Tid_http, Gfo_protocol_itm.Tid_https) // only consider http / https; ignore mailto and others; PAGE:uk.w:Маскалі; DATE:2015-07-28 + && Bry_.Match(src, site_bgn, site_end, xwiki.Domain_bry()) // only consider full domains, not alliases; EX: [http://w/b] should not match alias of w for en.wikipedia.org + ) { Xowe_wiki wiki = ctx.Wiki(); - Xoa_url_parser.Parse_url(xo_url_parser_url, ctx.App(), wiki, src, lnke_bgn, lnke_end, false); + xo_url_parser_url = wiki.Utl__url_parser().Parse(src, lnke_bgn, lnke_end); byte[] xwiki_wiki = xo_url_parser_url.Wiki_bry(); byte[] xwiki_page = xo_url_parser_url.Page_bry(); byte[] ttl_bry = xo_url_parser_url.Page_bry(); @@ -173,7 +178,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { xwiki_wiki = ttl.Wik_itm().Domain_bry(); xwiki_page = ttl.Page_url(); } - tkn.Lnke_xwiki_(xwiki_wiki, xwiki_page, xo_url_parser_url.Args()); + tkn.Lnke_xwiki_(xwiki_wiki, xwiki_page, xo_url_parser_url.Qargs_ary()); } ctx.Subs_add(root, tkn); if (lnke_type == Xop_lnke_tkn.Lnke_typ_brack) { 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 8f695e6b6..c924760e0 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 @@ -84,11 +84,11 @@ public class Xop_lnke_wkr_brack_tst { @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 '">' + , "B" // '%22%3E' not '">' ); fxt.Test_parse_page_wiki_str // encode args ( "[//a.org/A?b=%22%3E_C D]" - , "D" // '%22%3E' not '">' + , "D" // '%22%3E' not '">' ); } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_relative_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_relative_tst.java index 3db6e48a7..0365bf5ef 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_relative_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_relative_tst.java @@ -25,7 +25,7 @@ public class Xop_lnke_wkr_relative_tst { ); } @Test public void Relative_external() { - fxt.Test_parse_page_wiki_str("[//www.a.org a]", "a"); + fxt.Test_parse_page_wiki_str("[//www.a.org a]", "a"); } @Test public void Relative_internal() { fxt.Init_xwiki_add_user_("en.wikipedia.org"); 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 0732f8791..288139471 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 @@ -29,7 +29,7 @@ public class Xop_lnke_wkr_text_tst { fxt.Test_parse_page_wiki("irc://a b c", fxt.tkn_lnke_(0, 7).Lnke_rng_(0, 7), fxt.tkn_space_(7, 8), fxt.tkn_txt_(8, 9), fxt.tkn_space_(9, 10), fxt.tkn_txt_(10, 11)); } @Test public void Text_before_ascii() { // PURPOSE: free form external urls should not match if preceded by letters; EX:de.w:Sylvie_und_Bruno; DATE:2014-05-11 - fxt.Ctx().Lang().Case_mgr_utf8_(); + fxt.Ctx().Lang().Case_mgr_u8_(); String expd_lnke_html = "tel:a"; fxt.Test_parse_page_wiki_str("titel:a" , "titel:a"); fxt.Test_parse_page_wiki_str(" tel:a" , " " + expd_lnke_html); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java index 8ad02281d..f876c6fd7 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java @@ -40,4 +40,16 @@ public class Xop_lnke_wkr_xwiki_tst { fxt.App().Usere().Wiki().Xwiki_mgr().Add_full(Bry_.new_a7("en.wikipedia.org"), Bry_.new_a7("en.wikipedia.org")); fxt.Test_parse_page_wiki_str("[http://en.wikipedia.org/wiki/A?action=edit a]", "a"); } + @Test public void Ignore_proto() { // PURPOSE: handle other protocols; PAGE:uk.w:Маскалі; DATE:2015-07-28 + fxt.Test_parse_page_wiki_str("[mailto:a b]", "b");// should be /w/, not /en.wikipedia.org + } + @Test public void Ignore_alias() { // PURPOSE: fictitious example to make sure aliases are not subbed for domains; DATE:2015-07-28 + fxt.Init_xwiki_add_user_("w", "en.wikipedia.org"); + fxt.Test_parse_page_wiki_str("[https://w/b c]", "c");// should be /w/, not /en.wikipedia.org + } + @Test public void Xwiki__qargs() { // PURPOSE: fix null ref error; PAGE:en.w:Wikipedia:Template_standardisation/demometa DATE:2015-08-02 + fxt.Init_xwiki_add_user_("en.wikipedia.org"); + fxt.Test_parse_page_wiki_str("[http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template_standardisation/demometa]" + , "[1]"); + } } diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java index 5762bc4c1..e35d76345 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java @@ -22,7 +22,7 @@ public class Xop_log_invoke_wkr implements GfoInvkAble { private Xop_log_mgr log_mgr; private Db_conn conn; private Db_stmt stmt; private boolean log_enabled = true; - private Hash_adp_bry exclude_mod_names = Hash_adp_bry.cs_(); + private Hash_adp_bry exclude_mod_names = Hash_adp_bry.cs(); public Scrib_err_filter_mgr Err_filter_mgr() {return err_filter_mgr;} private final Scrib_err_filter_mgr err_filter_mgr = new Scrib_err_filter_mgr(); public Xop_log_invoke_wkr(Xop_log_mgr log_mgr, Db_conn conn) { this.log_mgr = log_mgr; diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java index c22f5de13..6ae348834 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java @@ -21,7 +21,7 @@ public class Xop_log_property_wkr implements GfoInvkAble { private Xop_log_mgr log_mgr; private Db_conn conn; private Db_stmt stmt; private boolean log_enabled = true; private boolean include_all = true; - private Hash_adp_bry include_props = Hash_adp_bry.cs_(); + private Hash_adp_bry include_props = Hash_adp_bry.cs(); public Xop_log_property_wkr(Xop_log_mgr log_mgr, Db_conn conn) { this.log_mgr = log_mgr; this.conn = conn; diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_ws_itm.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_ws_itm.java index 2bfa9d87d..aa91980f3 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_ws_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_ws_itm.java @@ -25,7 +25,7 @@ public class Xop_tblw_ws_itm { public static final byte Type_tb = Xop_tblw_wkr.Tblw_type_tb, Type_te = Xop_tblw_wkr.Tblw_type_te, Type_tr = Xop_tblw_wkr.Tblw_type_tr, Type_tc = Xop_tblw_wkr.Tblw_type_tc , Type_th = Xop_tblw_wkr.Tblw_type_th, Type_td = Xop_tblw_wkr.Tblw_type_td, Type_nl = 16, Type_xnde = 17; public static Btrie_slim_mgr trie_() {// MW.REF:Parser.php|doBlockLevels - Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.cs(); trie_itm(rv, Type_tb, Xop_tblw_lxr_ws.Hook_tb); trie_itm(rv, Type_te, Xop_tblw_lxr_ws.Hook_te); trie_itm(rv, Type_tr, Xop_tblw_lxr_ws.Hook_tr); diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java index c859f16c2..59c97b033 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java @@ -46,7 +46,7 @@ public class Nowiki_escape_itm { private static final byte[] Pre_bry = new byte[] {Byte_ascii.Nl, Byte_ascii.Space}; // NOTE: must go before trie_new private static final Btrie_slim_mgr trie = trie_new(); private static Btrie_slim_mgr trie_new() { - Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); + Btrie_slim_mgr rv = Btrie_slim_mgr.cs(); trie_new_itm(rv, Byte_ascii.Lt_bry , Xop_amp_trie.Bry_xowa_lt); trie_new_itm(rv, Byte_ascii.Brack_bgn_bry , Xop_amp_trie.Bry_xowa_brack_bgn); trie_new_itm(rv, Byte_ascii.Brack_end_bry , Xop_amp_trie.Bry_xowa_brack_end); // PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 @@ -57,7 +57,7 @@ public class Nowiki_escape_itm { trie_new_itm(rv, Byte_ascii.Asterisk_bry , Xop_amp_trie.Bry_xowa_asterisk); trie_new_itm(rv, Byte_ascii.Dash_bry , Xop_amp_trie.Bry_xowa_dash); // needed to handle "|-"; PAGE:de.w:Liste_von_Vereinen_und_Vereinigungen_von_Gl�ubigen_(r�misch-katholische_Kirche) DATE:2015-01-08 trie_new_itm(rv, Byte_ascii.Space_bry , Xop_amp_trie.Bry_xowa_space); - trie_new_itm(rv, Byte_ascii.Nl_bry , Xop_amp_trie.Bry_xowa_nl); + trie_new_itm(rv, Byte_ascii.Nl_bry , Xop_amp_trie.Bry_xowa_nl); trie_new_itm(rv, Pre_bry , Pre_bry); return rv; } diff --git a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java index a8575ed8c..ec9e748af 100644 --- a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java +++ b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java @@ -27,7 +27,7 @@ public class Gxw_html_server implements Gxw_html { this.usr_dlg = usr_dlg; this.wtr = wtr; } public void Html_doc_html_load_by_mem(String html) {Exec_as_str("location.reload(true);");} // HACK: force reload of page - public void Html_doc_html_load_by_url(String path, String html) {Exec_as_str("location.reload(true);");} // HACK: force reload of page + public void Html_doc_html_load_by_url(Io_url path, String html) {Exec_as_str("location.reload(true);");} // HACK: force reload of page public byte Html_doc_html_load_tid() {return html_doc_html_load_tid;} private byte html_doc_html_load_tid; public void Html_doc_html_load_tid_(byte v) {html_doc_html_load_tid = v;} public void Html_dispose() {} 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 ed699e569..ea53971f9 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 @@ -91,7 +91,7 @@ public class Http_server_mgr implements GfoInvkAble { Init_gui(); Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(wiki_domain); // get the wiki; assert init for Main_Page; EX:click zh.w on wiki sidebar; DATE:2015-07-19 if (Bry_.Len_eq_0(page_ttl)) page_ttl = wiki.Props().Main_page(); - Xoa_url page_url = app.Utl__url_parser().Parse(page_ttl); // get the url (needed for query args) + Xoa_url page_url = wiki.Utl__url_parser().Parse(page_ttl); // get the url (needed for query args) Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page_ttl); // get the ttl Xoae_page page = wiki.Load_page_by_ttl(page_url, ttl); // get page and parse it Gxw_html_server.Assert_tab(app, page); // HACK: assert at least 1 tab diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_v2.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_v2.java index d86e020e3..637ad8f9b 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_v2.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_wkr_v2.java @@ -125,7 +125,7 @@ class Http_server_wkr_v2 implements GfoInvkAble { } private static final byte[] Key__msg = Bry_.new_a7("msg"), Key__app_mode = Bry_.new_a7("app_mode"); private static final int Tid_post_url_json = 1, Tid_post_url_gfs = 2; - private static final Hash_adp_bry post_url_hash = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry post_url_hash = Hash_adp_bry.ci_a7() .Add_str_int("/exec/json" , Tid_post_url_json) .Add_str_int("/exec/gfs" , Tid_post_url_gfs) ; @@ -187,7 +187,7 @@ class Http_file_utl { , Mime_js = Bry_.new_a7("application/javascript") , Mime_octet_stream = Bry_.new_a7("application/octet-stream") ; - private static final Hash_adp_bry mime_hash = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry mime_hash = Hash_adp_bry.ci_a7() .Add_str_obj(".htm" , Mime_html) .Add_str_obj(".html" , Mime_html) .Add_str_obj(".jpg" , Mime_jpg) 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 8dc9e84bf..128a02fdd 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 @@ -28,8 +28,8 @@ public class Xosrv_msg_rdr { else return Xosrv_msg.fail_("header is invalid; hdr:{0}", String_.new_u8(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_.Xto_str(version)); - 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_u8(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_u8(header_bry, 13, 23)); + int body_len = Bry_.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_u8(header_bry, 2, 23)); + int cksum = Bry_.To_int_or(header_bry, 13, 23, -1); if (cksum == -1) return Xosrv_msg.fail_("checksum is not number; cksum:{0}", String_.new_u8(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_u8(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/setup/maints/Wmf_dump_list_parser_tst.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java index b48721411..ce4bd187b 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 @@ -42,7 +42,7 @@ public class Wmf_dump_list_parser_tst { ); } // @Test public void Update() { // MAINT:QUARTERLY:2015-03-01; must run C:\xowa\ and update dump status -// Hash_adp_bry excluded_domains = Hash_adp_bry.cs_().Add_many_str +// Hash_adp_bry excluded_domains = Hash_adp_bry.cs().Add_many_str // ( "advisory.wikipedia.org", "beta.wikiversity.org", "donate.wikipedia.org", "login.wikipedia.org" // , "nostalgia.wikipedia.org", "outreach.wikipedia.org", "quality.wikipedia.org", "sources.wikipedia.org" // , "strategy.wikipedia.org", "ten.wikipedia.org", "test2.wikipedia.org", "test.wikipedia.org" diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java index 6872a2c83..b47f9224a 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java @@ -30,11 +30,11 @@ public class Wmf_latest_parser { byte[] date_bgn_bry = Bry_.new_a7(""); byte[] date_end_bry = Bry_.new_a7(" "); // byte[] size_bgn_bry = Bry_.new_a7(""); - Btrie_slim_mgr date_trie = Btrie_slim_mgr.cs_() + Btrie_slim_mgr date_trie = Btrie_slim_mgr.cs() .Add_bry("Jan", "01").Add_bry("Feb", "02").Add_bry("Mar", "03").Add_bry("Apr", "04").Add_bry("May", "05").Add_bry("Jun", "06") .Add_bry("Jul", "07").Add_bry("Aug", "08").Add_bry("Sep", "09").Add_bry("Oct", "10").Add_bry("Nov", "11").Add_bry("Dec", "12") ; -// Btrie_slim_mgr size_trie = Btrie_slim_mgr.cs_() +// Btrie_slim_mgr size_trie = Btrie_slim_mgr.cs() // .Add_bry("B", " B").Add_bry("K", " KB").Add_bry("M", " MB").Add_bry("G", " GB"); byte[] date_or = Bry_.new_a7("1970-01-01 00:00:00"); // byte[] size_or = Bry_.new_a7("0 B"); diff --git a/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java b/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java index c69ac44ee..af72f061d 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java @@ -49,21 +49,24 @@ public class Xoa_maint_mgr implements GfoInvkAble { } public boolean Wmf_status_parse() { Wmf_dump_list_parser parser = new Wmf_dump_list_parser(); - Hash_adp_bry itms_hash = Hash_adp_bry.cs_(); + Hash_adp_bry itms_hash = Hash_adp_bry.cs(); Wmf_dump_itm[] itms = parser.Parse(Io_mgr.I.LoadFilBry(wmf_dump_status_url)); int len = itms.length; + Xoa_app_.Usr_dlg().Log_many("", "", "maint.html count; count=~{0}", len); for (int i = 0; i < len; i++) { Wmf_dump_itm itm = itms[i]; byte[] wiki_abrv = itm.Wiki_abrv(); + Xoa_app_.Usr_dlg().Log_many("", "", "maint.html itm; itm=~{0}", wiki_abrv); byte[] wiki_domain = Xow_wiki_alias.Parse__domain_name(wiki_abrv, 0, wiki_abrv.length); if (wiki_domain == Xow_wiki_alias.Parse__domain_name_null) continue; // invalid wiki-name; ex: nycwikimedia itms_hash.Add(wiki_domain, itm); } len = app.Wiki_mgr().Count(); + Xoa_app_.Usr_dlg().Log_many("", "", "maint.wiki_count; count=~{0}", len); for (int i = 0; i < len; i++) { Xowe_wiki wiki = app.Wiki_mgr().Get_at(i); - Wmf_dump_itm itm = (Wmf_dump_itm)itms_hash.Get_by_bry(wiki.Domain_bry()); - if (itm == null) continue; + Xoa_app_.Usr_dlg().Log_many("", "", "maint.wiki_itm; wiki=~{0}", wiki.Domain_str()); + Wmf_dump_itm itm = (Wmf_dump_itm)itms_hash.Get_by_bry(wiki.Domain_bry()); if (itm == null) continue; wiki.Maint_mgr().Wmf_dump_date_(itm.Dump_date()).Wmf_dump_done_(itm.Status_tid() == Wmf_dump_itm.Status_tid_complete).Wmf_dump_status_(itm.Status_msg()); } return true; 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 25beab159..3106919ae 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 @@ -34,7 +34,7 @@ public class Xow_maint_mgr implements GfoInvkAble { } private DateAdp wiki_dump_date; public boolean Wiki_update_needed() { if (this.Wiki_dump_date() == null) return false; // will be null if a custom wiki (i.e.: not on http://dumps.wikimedia.org/backup-index.html) - return this.Wmf_dump_date().Diff(this.Wiki_dump_date()).Total_days().Xto_double() > 1; + return this.Wmf_dump_date().Diff(this.Wiki_dump_date()).Total_days().To_double() > 1; } 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", ""); diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 469bbc56c..e05435d52 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -25,7 +25,7 @@ import gplx.xowa.users.data.*; public class Xows_mgr { private final Hash_adp_bry hash; public Xows_mgr(Xowe_wiki wiki, Xol_lang lang) { - hash = Hash_adp_bry.ci_utf8_(lang.Case_mgr()); + hash = Hash_adp_bry.ci_u8(lang.Case_mgr()); page_allpages = new Xows_page_allpages(wiki); page_search = new Xows_page__search(wiki); page_random = new Xows_page_random(wiki); 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 f9c4d0eda..75035e8c0 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 @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.allPages; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; import gplx.xowa.html.*; import gplx.xowa.html.hrefs.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.urls.*; public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page { public Xows_page_allpages(Xowe_wiki wiki) { this.wiki = wiki; @@ -71,13 +72,13 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page public Xowd_page_itm[] Rslt_list_ttls() {return rslt_list_ttls;} private Xowd_page_itm[] rslt_list_ttls; public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { wiki.Ctx().Cur_page().Html_data().Display_ttl_(wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_sp_allpages_hdr)); - url.Page_bry_(Bry_.Add(Bry_.new_a7("Special:"), ttl.Page_txt_wo_qargs())); // HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 + url.Page_bry_(Bry_.Add(Bry_.new_a7("Special:"), ttl.Page_txt_wo_qargs())); // HACK: need to re-set Page b/c href_wtr does not eliminate qargs; DATE:2013-02-08 if (wiki.Domain_tid() == Xow_domain_type_.Tid_home) {wiki.Appe().Usr_dlg().Prog_many(GRP_KEY, "home.invalid", "AllPages not implemented for home wiki"); return;} if (rslt_list_ttls == null) this.Itms_per_page_(itms_per_page); boolean found = Build_data(url, ttl); if (!found) return; Build_html(page); } - private static byte[] Get_from(Xoa_url_arg_hash arg_hash, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl) { + private static byte[] Get_from(Gfo_qarg_mgr arg_hash, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl) { return ttl.Leaf_bgn() == -1 ? arg_hash.Get_val_bry_or(Bry_arg_from, null) : ttl.Leaf_url() @@ -85,7 +86,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page } public boolean Build_data(Xoa_url url, Xoa_ttl ttl) { init_ns = wiki.Ns_mgr().Ns_main(); - arg_hash.Load(url); + arg_hash.Load(url.Qargs_ary()); byte[] from_val = Get_from(arg_hash, wiki, url, ttl); if (from_val == null) return false; from_val = Xoa_app_.Utl__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); @@ -99,7 +100,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page init_ns = from_ttl.Ns(); arg_hash.Set_val_by_int(Bry_arg_ns, init_ns.Id()); arg_hash.Set_val_by_bry(Bry_arg_from, from_ttl.Page_db()); - arg_hash.Save(url); + url.Qargs_ary_(arg_hash.To_ary()); } Int_obj_ref rslt_len = Int_obj_ref.new_(rslt_list_len); Xowd_page_itm rslt_nxt2 = new Xowd_page_itm(); @@ -113,7 +114,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page rslt_nxt = rslt_nxt2; rslt_prv = rslt_prv2; return true; - } private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); + } private Gfo_qarg_mgr arg_hash = new Gfo_qarg_mgr(); private static final byte[] Bry_arg_from = Bry_.new_a7("from"), Bry_arg_ns = Bry_.new_a7("namespace"), Bry_arg_hideredirects = Bry_.new_a7("hideredirects"); public Xow_ns Init_ns() {return init_ns;} private Xow_ns init_ns; public void Build_html(Xoae_page page) { @@ -166,10 +167,10 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page } class Xos_pagelist_html_itm_fmtr implements Bry_fmtr_arg { public Xos_pagelist_html_itm_fmtr(Xows_page_allpages mgr, Xowe_wiki wiki) { - this.mgr = mgr; this.wiki = wiki; this.href_parser = wiki.Appe().Href_parser(); this.wiki_key = wiki.Domain_bry(); + this.mgr = mgr; this.wiki = wiki; this.href_wtr = wiki.Appe().Html__href_wtr(); this.wiki_key = wiki.Domain_bry(); this.itm_normal = mgr.Html_list_itm_normal(); this.itm_redirect = mgr.Html_list_itm_redirect(); history_mgr = wiki.Appe().Usere().History_mgr(); - } private Xows_page_allpages mgr; Xowe_wiki wiki; Xoh_href_parser href_parser; Bry_fmtr itm_normal, itm_redirect; byte[] wiki_key; gplx.xowa.users.history.Xou_history_mgr history_mgr; + } private Xows_page_allpages mgr; Xowe_wiki wiki; Xoh_href_wtr href_wtr; Bry_fmtr itm_normal, itm_redirect; byte[] wiki_key; gplx.xowa.users.history.Xou_history_mgr history_mgr; public void Itm_idx_(int v) {itm_idx = v;} private int itm_idx; public void XferAry_bgn() { itms_per_grp = mgr.Itms_per_grp(); @@ -186,7 +187,7 @@ class Xos_pagelist_html_itm_fmtr implements Bry_fmtr_arg { Xowd_page_itm ttl_itm = ttls[i]; if (ttl_itm == null) break; // ttl_itm can be null at bgn or end of title list; EX: list=A-Z; count=5; key=Z; itms=X,Y,Z,null,null Xoa_ttl ttl = Xows_page_allpages.ttl_(wiki, init_ns, ttl_itm); - byte[] href = href_parser.Build_to_bry(wiki, ttl); + byte[] href = href_wtr.Build_to_bry(wiki, ttl); byte[] title = Xoh_html_wtr.Ttl_to_title(ttl.Full_txt()); byte[] cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki_key, ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add Bry_fmtr fmtr = ttl_itm.Redirected() ? itm_redirect : itm_normal; diff --git a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java index 370297ffb..7f7128816 100644 --- a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java +++ b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.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.specials.allPages; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.wikis.data.tbls.*; +import org.junit.*; import gplx.core.net.*; import gplx.xowa.wikis.data.tbls.*; public class Xows_page_allpages_tst { @Before public void init() {fxt.Clear();} private Xows_page_allpages_fxt fxt = new Xows_page_allpages_fxt(); @Test public void Build_data() { @@ -134,10 +134,10 @@ class Xows_page_allpages_fxt { return this; } private Xoae_app app; public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; Xows_page_allpages allpages; - public Xows_page_allpages_fxt Init_arg(String key, String val) {init_args.Add(new Gfo_url_arg(Bry_.new_a7(key), Bry_.new_a7(val))); return this;} private List_adp init_args = List_adp_.new_(); + public Xows_page_allpages_fxt Init_arg(String key, String val) {init_args.Add(new Gfo_qarg_itm(Bry_.new_a7(key), Bry_.new_a7(val))); return this;} private List_adp init_args = List_adp_.new_(); public Xows_page_allpages_fxt Init_ttl_leaf(String val) {init_ttl_leaf = val; return this;} private String init_ttl_leaf; public Xows_page_allpages_fxt Init_itms_per_page(int v) {init_itms_per_page = v; return this;} private int init_itms_per_page = 5; - public Xows_page_allpages_fxt Expd_arg(String key, String val) {expd_args.Add(new Gfo_url_arg(Bry_.new_a7(key), Bry_.new_a7(val))); return this;} private List_adp expd_args = List_adp_.new_(); + public Xows_page_allpages_fxt Expd_arg(String key, String val) {expd_args.Add(new Gfo_qarg_itm(Bry_.new_a7(key), Bry_.new_a7(val))); return this;} private List_adp expd_args = List_adp_.new_(); public Xows_page_allpages_fxt Expd_prv(String v) {expd_prv = v; return this;} private String expd_prv; public Xows_page_allpages_fxt Expd_nxt(String v) {expd_nxt = v; return this;} private String expd_nxt; public Xows_page_allpages_fxt Expd_ttls(String... v) {expd_ttls = v; return this;} private String[] expd_ttls; @@ -159,18 +159,17 @@ class Xows_page_allpages_fxt { } return rv; } - public static String[] Xto_str_ary(Gfo_url_arg[] ary) { + public static String[] Xto_str_ary(Gfo_qarg_itm[] ary) { int ary_len = ary.length; String[] rv = new String[ary_len]; for (int i = 0; i < ary_len; i++) { - Gfo_url_arg itm = ary[i]; + Gfo_qarg_itm itm = ary[i]; rv[i] = String_.new_u8(itm.Key_bry()) + "=" + String_.new_u8(itm.Val_bry()); } return rv; } public Xows_page_allpages_fxt Test_special_gen() { - Xoa_url_parser parserx = new Xoa_url_parser(); - parserx.Parse(init_url, Xows_special_meta_.Itm__all_pages.Ttl_bry()); + init_url = app.User().Wikii().Utl__url_parser().Parse(Xows_special_meta_.Itm__all_pages.Ttl_bry()); Xoa_ttl init_ttl = Make_init_ttl(); allpages.Special_gen(wiki, wiki.Ctx().Cur_page(), init_url, init_ttl); if (expd_display_ttl != null) Tfds.Eq(expd_display_ttl, String_.new_u8(wiki.Ctx().Cur_page().Html_data().Display_ttl())); @@ -183,11 +182,11 @@ class Xows_page_allpages_fxt { if (expd_nxt != null) Tfds.Eq(expd_nxt, Xto_str(wiki, allpages.Rslt_nxt())); if (expd_prv != null) Tfds.Eq(expd_prv, Xto_str(wiki, allpages.Rslt_prv())); if (expd_args.Count() > 0) { - Gfo_url_arg[] expd_args_ary = (Gfo_url_arg[])expd_args.To_ary(Gfo_url_arg.class); - Tfds.Eq_ary_str(Xto_str_ary(init_url.Args()), Xto_str_ary(expd_args_ary)); + Gfo_qarg_itm[] expd_args_ary = (Gfo_qarg_itm[])expd_args.To_ary(Gfo_qarg_itm.class); + Tfds.Eq_ary_str(Xto_str_ary(expd_args_ary), Xto_str_ary(init_url.Qargs_ary())); } return this; - } private Xoa_url init_url = Xoa_url.blank_(); + } private Xoa_url init_url = Xoa_url.blank(); public Xows_page_allpages_fxt Test_build_html(String expd) { Exec_build(); allpages.Build_html(wiki.Ctx().Cur_page()); @@ -196,7 +195,7 @@ class Xows_page_allpages_fxt { } private void Exec_build() { if (allpages.Itms_per_page() != init_itms_per_page) allpages.Itms_per_page_(init_itms_per_page); - init_url.Args_((Gfo_url_arg[])init_args.To_ary(Gfo_url_arg.class)); + init_url.Qargs_ary_((Gfo_qarg_itm[])init_args.To_ary(Gfo_qarg_itm.class)); init_args.Clear(); Xoa_ttl init_ttl = Make_init_ttl(); allpages.Build_data(init_url, init_ttl); 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 f8322b0c8..11356a594 100644 --- a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java +++ b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.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.specials.movePage; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.core.primitives.*; import gplx.core.net.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.html.hrefs.*; public class Move_page implements Xows_page { private Move_trg_ns_list_fmtr ns_list_fmtr = new Move_trg_ns_list_fmtr(); @@ -67,7 +67,7 @@ public class Move_page implements Xows_page { wiki.Parser().Parse_text_to_html(tmp_bfr, page, true, msg_mgr.Val_by_key_obj("movepagetext")); fmtr_all.Bld_bfr_many(tmp_bfr , msg_mgr.Val_by_key_obj("move-page-legend") - , Bry_.Add(Xoh_href_parser.Href_wiki_bry, src_ttl.Full_db()) + , Bry_.Add(Xoh_href_.Bry__wiki, src_ttl.Full_db()) , gplx.html.Html_utl.Escape_html_as_bry(src_ttl.Full_txt()) , src_ttl.Full_txt() , msg_mgr.Val_by_key_obj("newtitle") @@ -147,19 +147,19 @@ class Move_url_args { public boolean Create_redirect() {return create_redirect;} private boolean create_redirect; public void Parse(Xoa_url url) { this.Clear(); - Gfo_url_arg[] args = url.Args(); + Gfo_qarg_itm[] args = url.Qargs_ary(); int args_len = args.length; for (int i = 0; i < args_len; i++) { - Gfo_url_arg arg = args[i]; + Gfo_qarg_itm arg = args[i]; Object tid_obj = arg_keys.Get_by(arg.Key_bry()); byte[] val_bry = arg.Val_bry(); if (tid_obj != null) { 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_.Xto_int_or_fail(val_bry); break; + case Key_trg_ns: trg_ns = Bry_.To_int(val_bry); break; case Key_trg_ttl: trg_ttl = val_bry; break; - case Key_create_redirect: create_redirect = Bry_.Xto_bool_by_int_or_fail(val_bry); break; + case Key_create_redirect: create_redirect = Bry_.To_bool_by_int(val_bry); break; } } } @@ -171,7 +171,7 @@ class Move_url_args { create_redirect = false; } private static final byte Key_submitted = 1, Key_src_ttl = 2, Key_trg_ns = 3, Key_trg_ttl = 4, Key_create_redirect = 5; - private static final Hash_adp_bry arg_keys = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry arg_keys = Hash_adp_bry.ci_a7() .Add_str_byte("wpMove" , Key_submitted) .Add_str_byte("wpOldTitle" , Key_src_ttl) .Add_str_byte("wpNewTitleNs" , Key_trg_ns) diff --git a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java index 713f39b4b..1983d14d0 100644 --- a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.specials.nearby; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; public class Nearby_mgr implements Xows_page { Xowe_wiki wiki; byte[] trg; - private Hash_adp_bry excluded = Hash_adp_bry.ci_ascii_(); - private Hash_adp_bry visited = Hash_adp_bry.ci_ascii_(); + private Hash_adp_bry excluded = Hash_adp_bry.ci_a7(); + private Hash_adp_bry visited = Hash_adp_bry.ci_a7(); List_adp trail = List_adp_.new_(); List_adp results = List_adp_.new_(); int results_cur = 0; diff --git a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr_tst.java b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr_tst.java index 502fc9a1a..29852cbf6 100644 --- a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr_tst.java @@ -46,7 +46,7 @@ class Nearby_mgr_fxt { if (fxt == null) { fxt = new Xop_fxt(); nearby_mgr = new Nearby_mgr(); - excluded = Hash_adp_bry.ci_ascii_(); + excluded = Hash_adp_bry.ci_a7(); tmp_bfr = Bry_bfr.new_(); } fxt.Reset(); diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java index f9bb9391b..dcd369fc3 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java @@ -45,7 +45,7 @@ class Xop_randomRootPage_page_fxt { } public static Xoae_page Test_special_open(Xowe_wiki wiki, Xows_page special_page, String special_url) { Xoae_page page = wiki.Ctx().Cur_page(); - Xoa_url url = wiki.Appe().Utl__url_parser().Parse(Bry_.new_u8(special_url)); + Xoa_url url = wiki.Utl__url_parser().Parse(Bry_.new_u8(special_url)); page.Url_(url); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_a7(special_url)); page.Ttl_(ttl); 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 038b8aaf4..77d4bd4d0 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 @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.gfui.*; import gplx.core.threads.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.core.net.*; import gplx.core.threads.*; +import gplx.gfui.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.data.tbls.*; import gplx.core.js.*; public class Xog_search_suggest_mgr implements GfoInvkAble { public Xog_search_suggest_mgr(Xoa_gui_mgr gui_mgr) { @@ -30,13 +31,13 @@ public class Xog_search_suggest_mgr implements GfoInvkAble { public int All_pages_extend() {return all_pages_extend;} private int all_pages_extend = 1000; // look ahead by 1000 public int All_pages_min() {return all_pages_min;} private int all_pages_min = 10000; // only look at pages > 10 kb public boolean Auto_wildcard() {return auto_wildcard;} private boolean auto_wildcard = false; // automatically add wild-card; EX: Earth -> *Earth* - public Gfo_url_arg[] Args_default() {return args_default;} private Gfo_url_arg[] args_default = Gfo_url_arg.Ary_empty; + public Gfo_qarg_itm[] Args_default() {return args_default;} private Gfo_qarg_itm[] args_default = Gfo_qarg_itm.Ary_empty; public void Args_default_str_(String v) { this.args_default_str = v; byte[] bry = Bry_.new_a7("http://x.org/a?" + v); Gfo_url tmp_url = new Gfo_url(); - app.Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length); - args_default = tmp_url.Args(); + app.User().Wikii().Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length); + args_default = tmp_url.Qargs(); } private String args_default_str = "";// default args for search public static final int[] Ns_default_main = new int[] {Xow_ns_.Id_main}; diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java index c343b071e..40a4ef12e 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java @@ -37,7 +37,7 @@ public class Xosrh_core_tst { // fxt.Test_search("b*", 3, "B3_13"); // } // @Test public void Url() { -// Xoa_url url = Xoa_url_parser.Parse_url(fxt.App(), fxt.Wiki(), "Special:Search/Abc?fulltext=y&xowa_sort=len_desc"); +// Xoa_url url = Xoa_url_parser_old.Parse_url(fxt.App(), fxt.Wiki(), "Special:Search/Abc?fulltext=y&xowa_sort=len_desc"); // fxt.Search_mgr().Args_mgr().Clear().Parse(url.Args()); // Tfds.Eq(Xosrh_rslt_itm_sorter.Tid_len_dsc, fxt.Search_mgr().Args_mgr().Sort_tid()); // } @@ -167,12 +167,12 @@ public class Xosrh_core_tst { // } // public Xows_page__search Search_mgr() {return search_mgr;} // public void Test_url_search_bry(String url_str, String expd) { -// Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); +// Xoa_url url = Xoa_url_parser_old.Parse_url(app, wiki, url_str); // search_mgr.Args_mgr().Clear().Parse(url.Args()); // Tfds.Eq(expd, String_.new_u8(search_mgr.Args_mgr().Search_bry())); // } // public void Test_url__ns(String url_str, String expd) { -// Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); +// Xoa_url url = Xoa_url_parser_old.Parse_url(app, wiki, url_str); // search_mgr.Args_mgr().Clear().Parse(url.Args()); // Tfds.Eq(expd, String_.new_a7(search_mgr.Args_mgr().Ns_mgr().Xto_hash_key())); // } @@ -197,7 +197,7 @@ public class Xosrh_core_tst { // } // public void Test_search2(byte match_tid, String ttl_str, int page_idx, byte sort_tid, params String[] expd_ary) { // Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128(); -// Xoa_url_parser url_parser = new Xoa_url_parser(); +// Xoa_url_parser_old url_parser = new Xoa_url_parser_old(); // byte[] url_raw = Bry_.new_a7("Special:Search/" + ttl_str + ((match_tid == Xows_page__search.Match_tid_all) ? "" : "*") + "?fulltext=y" + Xosrh_rslt_itm_sorter.Xto_url_arg(sort_tid) + "&xowa_page_size=1&xowa_page_index=" + page_idx); // Xoa_url url = url_parser.Parse(url_raw); // Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url_raw); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java index a5643ab77..4d3b3f563 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java @@ -46,7 +46,7 @@ class Xosrh_page_mgr_fxt { for (int i = bgn; i < end; i++) { byte[] id_bry = new byte[5]; // NOTE: do not reuse; will break hive_mgr Base85_utl.XtoStrByAry(i, id_bry, 0, 5); - tmp_itm.Ns_id_(Xow_ns_.Id_main).Init(i, Bry_.XtoStrBytesByInt(i, 0), false, 10, 0, i - bgn); + tmp_itm.Ns_id_(Xow_ns_.Id_main).Init(i, Bry_.To_a7_bry(i, 0), false, 10, 0, i - bgn); Xotdb_page_itm_.Txt_id_save(tmp_bfr, tmp_itm); hive_mgr.Create(id_bry, tmp_bfr.Xto_bry_and_clear(), null); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java index ac57e20ef..525132aa8 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java @@ -130,7 +130,7 @@ class Xosrh_scanner { Ordered_hash tmp_list = Ordered_hash_.new_(); Bry_bfr tmp_bfr = Bry_bfr.new_(); Xosrh_qry_tkn new_tkn_(byte tid, int val_bgn, int val_end) {return Xosrh_qry_tkn.new_pos_(tid, val_bgn, val_end);} private static byte[] Bry_and = Bry_.new_a7("AND"); - private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_()// NOTE:ci.ascii:OR / AND only + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7()// NOTE:ci.ascii:OR / AND only .Add_str_byte(" ", Xosrh_qry_tkn.Tid_space) .Add_str_byte("\"", Xosrh_qry_tkn.Tid_quote) .Add_str_byte("-", Xosrh_qry_tkn.Tid_not) diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_arg_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_arg_mgr.java index e9f995924..29b973a58 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_arg_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_arg_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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; class Xows_arg_mgr { private final Xows_paging_parser paging_parser = new Xows_paging_parser(); public Xows_ns_mgr Ns_mgr() {return ns_mgr;} private final Xows_ns_mgr ns_mgr = new Xows_ns_mgr(); @@ -34,17 +34,17 @@ class Xows_arg_mgr { this.cancel = null; return this; } - public void Parse(Gfo_url_arg[] arg_ary) { + public void Parse(Gfo_qarg_itm[] arg_ary) { if (arg_ary == null) return; int len = arg_ary.length; for (int i = 0; i < len; ++i) { - Gfo_url_arg arg = arg_ary[i]; + Gfo_qarg_itm arg = arg_ary[i]; byte[] key = arg.Key_bry(); Object tid = url_args.Get_by(key); if (tid != null) { switch (((Byte_obj_val)tid).Val()) { case Arg_search: this.search_bry = Bry_.Replace(arg.Val_bry(), Byte_ascii.Plus, Byte_ascii.Space); break; - case Arg_page_idx: this.paging_idx = Bry_.Xto_int_or(arg.Val_bry(), 0); break; + case Arg_page_idx: this.paging_idx = Bry_.To_int_or(arg.Val_bry(), 0); break; case Arg_sort: this.sort_tid = Xosrh_rslt_itm_sorter.parse_(String_.new_a7(arg.Val_bry())); break; case Arg_cancel: this.cancel = arg.Val_bry(); break; case Arg_paging: this.paging_itms = paging_parser.Parse(arg.Val_bry()); break; @@ -64,7 +64,7 @@ class Xows_arg_mgr { Arg_bry_page_index = Bry_.new_a7("xowa_page_index") , Arg_bry_cancel = Bry_.new_a7("cancel") ; - private static final Hash_adp_bry url_args = Hash_adp_bry.ci_ascii_() + private static final Hash_adp_bry url_args = Hash_adp_bry.ci_a7() .Add_str_byte("xowa_paging", Arg_paging) .Add_bry_byte(Arg_bry_page_index, Arg_page_idx) .Add_str_byte("xowa_sort", Arg_sort) diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_core.java b/400_xowa/src/gplx/xowa/specials/search/Xows_core.java index b915391fb..6ced59223 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_core.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_core.java @@ -19,8 +19,8 @@ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gpl import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; class Xows_core { private final Xoae_wiki_mgr wiki_mgr; - private final Hash_adp_bry cache_hash = Hash_adp_bry.cs_(); private final Hash_adp_bry cmd_hash = Hash_adp_bry.cs_(); - private boolean ask_for_upgrade = true; private final Hash_adp_bry upgraded_wikis = Hash_adp_bry.cs_(); + private final Hash_adp_bry cache_hash = Hash_adp_bry.cs(); private final Hash_adp_bry cmd_hash = Hash_adp_bry.cs(); + private boolean ask_for_upgrade = true; private final Hash_adp_bry upgraded_wikis = Hash_adp_bry.cs(); public Xows_core(Xoae_wiki_mgr wiki_mgr) {this.wiki_mgr = wiki_mgr;} private final Xows_html_wkr html_wkr = new Xows_html_wkr(); public Xows_db_cache Get_cache_or_new(byte[] key) { diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java index b2c2eefb1..a32394850 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java @@ -44,13 +44,13 @@ public class Xows_ns_mgr { ns_all = true; } public void Add_by_parse(byte[] key, byte[] val) { - int ns_enabled = Bry_.Xto_int(val); + int ns_enabled = Bry_.To_int_or_neg1(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.Star) // translate ns* as ns_all ns_all = true; else { - int ns_id = Bry_.Xto_int_or(key, 2, key_len, Int_.MinValue); + int ns_id = Bry_.To_int_or(key, 2, key_len, Int_.MinValue); if (ns_id != Int_.MinValue) { // ignore invalid ints; EX: &nsabc=1; Add_by_id(ns_id); ns_main = ns_all = false; diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java index 1b270decd..40454cfec 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java @@ -51,7 +51,7 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { Xog_search_suggest_mgr search_suggest_mgr = wiki.Appe().Gui_mgr().Search_suggest_mgr(); args_mgr.Clear(); args_mgr.Parse(search_suggest_mgr.Args_default()); - args_mgr.Parse(url.Args()); + args_mgr.Parse(url.Qargs_ary()); args_mgr.Ns_mgr().Add_main_if_empty(); // get search_bry byte[] search_bry = args_mgr.Search_bry(); @@ -64,14 +64,14 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { && Bry_finder.Find_fwd(search_bry, Byte_ascii.Star) == -1 // search term does not have asterisk ) search_bry = Bry_.Add(search_bry, Byte_ascii.Star); - url.Page_bry_(Bry_.Add(Xows_special_meta_.Itm__search.Ttl_bry(), Byte_ascii.Slash_bry, search_bry));// HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 + // url.Page_bry_(Bry_.Add(Xows_special_meta_.Itm__search.Ttl_bry(), Byte_ascii.Slash_bry, search_bry));// HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 // search wiki Xoa_ttl search_ttl = Xoa_ttl.parse_(wiki, search_bry); Xoae_page search_page = page; if (!Bry_.Eq(search_bry, Xows_special_meta_.Itm__search.Ttl_bry())) // do not lookup page else stack overflow; happens when going directly to Special:Search (from history) search_page = wiki.Data_mgr().Get_page(search_ttl, false); // try to find page; EX:Special:Search?search=Earth -> en.w:Earth; needed for search suggest // page not found, or explicit_search invoked - if (search_page.Missing() || url.Search_fulltext()) { + if (search_page.Missing() || url.Qargs_mgr().Match(Qarg__fulltext, Qarg__fulltext__y)) { if (args_mgr.Cancel() != null) { search_mgr.Cancel(args_mgr.Cancel()); page.Tab_data().Cancel_show_y_(); @@ -99,4 +99,5 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { } public static final byte Match_tid_all = 0, Match_tid_bgn = 1; public static final byte Version_null = 0, Version_1 = 1, Version_2 = 2; + private static final byte[] Qarg__fulltext = Bry_.new_a7("fulltext"), Qarg__fulltext__y = Bry_.new_a7("y"); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java index 4bf871509..29d867341 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java @@ -45,7 +45,7 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr { if (!cache.Done() && (qry.Itms_end() > cache.Itms_end())) { if (async) { fill_from_cache = false; // NOTE: do not retrieve cached results to page, else ui_async cmd will add out of order; DATE:2015-04-24 - if (async_wkr == null) async_wkr = new Xows_ui_async(this, new Xows_html_row(new gplx.xowa.html.wtrs.Xoh_lnki_bldr(wiki.App(), wiki.App().Html__href_parser())), js_wkr, qry.Page_len(), wiki.Domain_bry()); + if (async_wkr == null) async_wkr = new Xows_ui_async(this, new Xows_html_row(new gplx.xowa.html.wtrs.Xoh_lnki_bldr(wiki.App(), wiki.App().Html__href_wtr())), js_wkr, qry.Page_len(), wiki.Domain_bry()); Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_search_db, this, Invk_search_db).Start(); } else @@ -88,7 +88,7 @@ class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr { } public boolean When_close(Xog_tab_itm tab, Xoa_url url) { if (url != Xoa_url.Null) { // not called by close_tab (Ctrl+W) - byte[] cancel_arg = url.Args_hash().Get_val_bry_or(Xows_arg_mgr.Arg_bry_cancel, null); + byte[] cancel_arg = url.Qargs_mgr().Get_val_bry_or(Xows_arg_mgr.Arg_bry_cancel, null); if (cancel_arg != null) return true; // cancel arg exists; assume tab is not being closed; note that cancel will be processed by Xows_page__special; DATE:2015-04-30 } this.Cancel(); diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2.java index 27e98590b..762b129d1 100644 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2.java +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; import gplx.core.btries.*; import gplx.xowa.langs.cases.*; class Xows_text_parser__v2 { - private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); private final Bry_bfr bfr = Bry_bfr.new_(32); private Xob_word_mgr word_mgr; private Xol_case_mgr case_mgr; private byte[] src; private int end; // bgn, diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2_tst.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2_tst.java index 771365063..5eb56384a 100644 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2_tst.java @@ -115,7 +115,7 @@ class Xows_text_parser__v2_fxt { private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); private Xol_case_mgr case_mgr; public void Init() { - case_mgr = Xol_case_mgr_.Ascii(); + case_mgr = Xol_case_mgr_.A7(); word_parser.Init_for_ttl(word_mgr, case_mgr); } public Xows_text_parser__v2_fxt Clear() { diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_tkn.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_tkn.java index befdff5b4..59c7fedcf 100644 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_tkn.java +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_tkn.java @@ -22,7 +22,7 @@ interface Xows_text_tkn { } class Xows_text_tkn__split implements Xows_text_tkn { private final boolean add_sym_as_word; - private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); public Xows_text_tkn__split(boolean add_sym_as_word, byte[][] ary) { this.add_sym_as_word = add_sym_as_word; int len = ary.length; diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java b/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java index 9641a52fb..5f600e0be 100644 --- a/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java +++ b/400_xowa/src/gplx/xowa/specials/search/parsers_old/Xow_search_scanner.java @@ -133,7 +133,7 @@ class Xow_search_scanner { } private Xow_search_tkn new_tkn(byte tid, int val_bgn, int val_end) {return Xow_search_tkn.new_pos(tid, val_bgn, val_end);} private static final byte[] Bry_and = Bry_.new_a7("AND"); - private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_()// NOTE:ci.ascii:OR / AND only + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7()// NOTE:ci.ascii:OR / AND only .Add_str_byte(" " , Xow_search_tkn.Tid_space) .Add_str_byte("\"" , Xow_search_tkn.Tid_quote) .Add_str_byte("-" , Xow_search_tkn.Tid_not) diff --git a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java index 0f45eaff9..8332b41c7 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java @@ -56,7 +56,7 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { byte[] new_name = vals.Get_val_as_bry("name"); byte[] new_url_bry = vals.Get_val_as_bry("url"); byte[] new_comment = vals.Get_val_as_bry("comment"); - Xoa_url new_url = app.Utl__url_parser().Parse(new_url_bry); + Xoa_url new_url = app.User().Wikii().Utl__url_parser().Parse(new_url_bry); if (new_url.Page_bry() == null) return msg_bldr.Clear().Notify_fail_(Err_msg.To_str("Url is invalid", "url", new_url.Raw())).To_json_str(); tbl.Update(db_row.Id(), db_row.Owner(), db_row.Sort(), new_name, new_url.Wiki_bry(), new_url_bry, new_comment); Dbui_row_itm ui_row = Get_ui_row(row_pkey, new_name, new_url_bry, new_comment); @@ -67,7 +67,7 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { int len = db_rows.length; if (len != pkeys.length) return msg_bldr.Clear().Notify_fail_(Err_msg.To_str("Rows have changed")).Notify_hint_("Please reload the page").To_json_str(); for (int i = 0; i < len; ++i) { int old_pkey = db_rows[i].Id(); - int new_pkey = Bry_.Xto_int(pkeys[i]); + int new_pkey = Bry_.To_int_or_neg1(pkeys[i]); if (old_pkey == new_pkey) continue; // order hasn't changed; EX: 5 in list; 4th moved to 5th; 1 through 3 will have same sort order; tbl.Update_sort(new_pkey, i); } @@ -87,7 +87,7 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { return app.Html__bridge_mgr().Msg_bldr().Clear().Data("html", tmp_bfr.Xto_bry_and_clear()).To_json_str(); } private Xoud_bmk_itm_row Get_db_row(byte[] pkey) { - int bmk_id = Bry_.Xto_int_or_fail(pkey); + int bmk_id = Bry_.To_int(pkey); return tbl.Select_or_null(bmk_id); } private Dbui_row_itm Get_ui_row(Xoud_bmk_itm_row row) {return Get_ui_row(Int_.Xto_bry(row.Id()), row.Name(), row.Url(), row.Comment());} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__file_check.java b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__file_check.java index bc780326d..83bb86ca0 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__file_check.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__file_check.java @@ -16,11 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.diags; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import gplx.core.net.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.origs.*; +import gplx.xowa.urls.*; class Xows_cmd__file_check { private Io_url tmp_dir; - public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Xoa_url_arg_hash arg_hash) { + public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Gfo_qarg_mgr arg_hash) { byte[] wiki_bry = arg_hash.Get_val_bry_or(Arg_wiki, null); if (wiki_bry == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "special.cmd; no wiki: url=~{0}", url.Raw()); return;} byte[] file_bry = arg_hash.Get_val_bry_or(Arg_file, null); if (file_bry == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "special.cmd; no file: url=~{0}", url.Raw()); return;} Xow_wiki wiki = app.Wiki_mgri().Get_by_key_or_make_init_y(wiki_bry); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__fs_check.java b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__fs_check.java index e1c6c03af..57ab63710 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__fs_check.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__fs_check.java @@ -16,10 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.diags; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.ios.*; +import gplx.ios.*; import gplx.core.net.*; import gplx.fsdb.meta.*; +import gplx.xowa.urls.*; class Xows_cmd__fs_check { - public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Xoa_url_arg_hash arg_hash) { + public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Gfo_qarg_mgr arg_hash) { byte[] dir_bry = arg_hash.Get_val_bry_or(Arg_dir, null); if (dir_bry != null) { Write_dir(bfr, Io_url_.new_dir_(String_.new_u8(dir_bry))); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__sql_dump.java b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__sql_dump.java index 8b6de59b8..64375adfe 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__sql_dump.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_cmd__sql_dump.java @@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.diags; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.ios.*; import gplx.core.primitives.*; +import gplx.ios.*; import gplx.core.primitives.*; import gplx.core.net.*; import gplx.dbs.*; import gplx.fsdb.meta.*; +import gplx.xowa.urls.*; class Xows_cmd__sql_dump { - public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Xoa_url_arg_hash arg_hash) { + public void Exec(Bry_bfr bfr, Xoa_app app, Xoa_url url, Gfo_qarg_mgr arg_hash) { Db_conn conn = null; byte[] sql_bry = arg_hash.Get_val_bry_or(Arg_sql, null); if (sql_bry == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "special.cmd; no sql: url=~{0}", url.Raw()); return;} byte[] wiki_bry = arg_hash.Get_val_bry_or(Arg_wiki, null); @@ -43,7 +44,7 @@ class Xows_cmd__sql_dump { public static final Xows_cmd__sql_dump I = new Xows_cmd__sql_dump(); Xows_cmd__sql_dump() {} private static final byte[] Arg_wiki = Bry_.new_a7("wiki"), Arg_db_file = Bry_.new_a7("db_file"), Arg_db_type = Bry_.new_a7("db_type"), Arg_sql = Bry_.new_a7("sql"); private static final byte Db_type_fsdb_abc = 1, Db_type_fsdb_atr = 2, Db_type_wiki_core = 3; - private static final Hash_adp_bry db_type_hash = Hash_adp_bry.cs_() + private static final Hash_adp_bry db_type_hash = Hash_adp_bry.cs() .Add_str_byte("fsdb.abc" , Db_type_fsdb_abc) .Add_str_byte("fsdb.atr" , Db_type_fsdb_atr) .Add_str_byte("wiki.core" , Db_type_wiki_core) diff --git a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_diag_page.java b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_diag_page.java index d22b227fa..d033d8f00 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_diag_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/diags/Xows_diag_page.java @@ -16,12 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.diags; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; +import gplx.xowa.urls.*; public class Xows_diag_page implements Xows_page { - private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); + private Gfo_qarg_mgr arg_hash = new Gfo_qarg_mgr(); public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__diag;} public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { - arg_hash.Load(url); + arg_hash.Load(url.Qargs_ary()); byte[] cmd_type_bry = arg_hash.Get_val_bry_or(Arg_type, null); if (cmd_type_bry == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "special.cmd; no type: url=~{0}", url.Raw()); return;} Byte_obj_val cmd_type_val = (Byte_obj_val)type_hash.Get_by_bry(cmd_type_bry); if (cmd_type_val == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "special.cmd; bad type: url=~{0}", url.Raw()); return;} Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_m001(); @@ -36,7 +37,7 @@ public class Xows_diag_page implements Xows_page { } private static final byte[] Arg_type = Bry_.new_a7("type"); private static final byte Type_file_check = 1, Type_fs_check = 2, Type_sql_dump = 3; - private static final Hash_adp_bry type_hash = Hash_adp_bry.cs_() + private static final Hash_adp_bry type_hash = Hash_adp_bry.cs() .Add_str_byte("file.check" , Type_file_check) .Add_str_byte("fs.check" , Type_fs_check) .Add_str_byte("sql.dump" , Type_sql_dump) diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java index bf568b24f..cbd3b1b2c 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java @@ -16,38 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; class Xoa_url_arg_mgr { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); private final Xoa_url_enum_mgr enm_mgr; public Xoa_url_arg_mgr(Xoa_url_enum_mgr enm_mgr) {this.enm_mgr = enm_mgr;} - public void Init(Gfo_url_arg[] args) { + public void Init(Gfo_qarg_itm[] args) { hash.Clear(); int len = args.length; for (int i = 0; i < len; ++i) { - Gfo_url_arg arg = args[i]; + Gfo_qarg_itm arg = args[i]; hash.Add_bry_obj(arg.Key_bry(), arg); } } public int Read_enm_or_neg1(byte[] key) { Xoa_url_enum_itm enm = enm_mgr.Get(key); if (enm == null) return -1; - Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); if (arg == null) return -1; + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by_bry(key); if (arg == null) return -1; return enm.Get_as_int_or(arg.Val_bry(), -1); } public byte[] Read_bry_or_empty(byte[] key) {return Read_bry_or(key, Bry_.Empty);} public byte[] Read_bry_or_null(byte[] key) {return Read_bry_or(key, null);} public byte[] Read_bry_or(byte[] key, byte[] or) { - Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by_bry(key); return arg == null ? or : arg.Val_bry(); } public String Read_str_or_null(String key) {return Read_str_or_null(Bry_.new_u8(key));} public String Read_str_or_null(byte[] key) { - Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); + Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by_bry(key); return arg == null ? null : String_.new_u8(arg.Val_bry()); } } class Xoa_url_enum_mgr { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); public Xoa_url_enum_mgr(Xoa_url_enum_itm... ary) { int len = ary.length; for (int i = 0; i < len; ++i) { @@ -58,7 +58,7 @@ class Xoa_url_enum_mgr { public Xoa_url_enum_itm Get(byte[] key) {return (Xoa_url_enum_itm)hash.Get_by_bry(key);} } class Xoa_url_enum_itm { - private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Hash_adp_bry hash = Hash_adp_bry.cs(); public Xoa_url_enum_itm(byte[] key) {this.key = key;} public byte[] Key() {return key;} private final byte[] key; public Xoa_url_enum_itm Add(String key, int val) { diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java index 377c25651..f82e2768c 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java @@ -16,24 +16,24 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.xowa.specials.*; import gplx.ios.*; +import gplx.xowa.specials.*; import gplx.ios.*; import gplx.core.net.*; public class Xosp_fbrow_special implements Xows_page { private static final Xoa_url_arg_mgr url_args = new Xoa_url_arg_mgr(null); public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__file_browser;} public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { - Xosp_fbrow_rslt rslt = Gen(url.Args(), GfoInvkAble_.Null); + Xosp_fbrow_rslt rslt = Gen(url.Qargs_ary(), GfoInvkAble_.Null); page.Html_data().Html_restricted_n_(); page.Html_data().Custom_head_end_concat(rslt.Html_head()); page.Data_raw_(rslt.Html_body()); } - public static Xosp_fbrow_rslt Gen(Gfo_url_arg[] args, GfoInvkAble select_invkable) { + public static Xosp_fbrow_rslt Gen(Gfo_qarg_itm[] args, GfoInvkAble select_invkable) { url_args.Init(args); byte[] cmd_bry = url_args.Read_bry_or_empty(Arg_cmd); Xosp_fbrow_cmd cmd = (Xosp_fbrow_cmd)cmd_regy.Get_by_bry(cmd_bry); if (cmd == null) cmd = Xosp_fbrow_cmd__err.I; return cmd.Make_new().Write_html(url_args, select_invkable); } private static final byte[] Arg_cmd = Bry_.new_a7("cmd"); - private static final Hash_adp_bry cmd_regy = Hash_adp_bry.cs_() + private static final Hash_adp_bry cmd_regy = Hash_adp_bry.cs() .Add_bry_obj(Xosp_fbrow_cmd__wiki_add.Regy_key, Xosp_fbrow_cmd__wiki_add.I) .Add_bry_obj(Xosp_fbrow_cmd__root_set.Regy_key, Xosp_fbrow_cmd__root_set.I) ; diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java index c1c6d36b4..b53a0ae63 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.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.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import org.junit.*; import gplx.ios.*; +import org.junit.*; import gplx.core.net.*; import gplx.ios.*; public class Xosp_fbrow_special_tst { @Before public void init() {fxt.Clear();} private Xosp_fbrow_special_fxt fxt = new Xosp_fbrow_special_fxt(); @Test public void Basic() { @@ -136,8 +136,8 @@ class Xosp_fbrow_special_fxt { } public void Test_nav(String path, String expd) { Xoa_url_arg_mgr args_mgr = new Xoa_url_arg_mgr(null); - Xoa_url url = Xoa_url.new_(Bry_.Empty, Bry_.Empty).Args_(Gfo_url_arg.Ary("cmd", "xowa.wiki.add", "mode", "view", "path", path)); - args_mgr.Init(url.Args()); + Xoa_url url = Xoa_url.new_(Bry_.Empty, Bry_.Empty).Qargs_ary_(Gfo_qarg_itm.Ary("cmd", "xowa.wiki.add", "mode", "view", "path", path)); + args_mgr.Init(url.Qargs_ary()); Xosp_fbrow_cmd__wiki_add cmd = new Xosp_fbrow_cmd__wiki_add(); byte[] actl = cmd.Write_html(args_mgr, GfoInvkAble_.Null).Html_body(); Tfds.Eq_str_lines(expd, String_.new_u8(actl)); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java index b3d8ba6fb..2056dfca5 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java @@ -16,12 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.xowa.system_data; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.net.*; +import gplx.xowa.urls.*; public class System_data_page implements Xows_page { - private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); + private Gfo_qarg_mgr arg_hash = new Gfo_qarg_mgr(); public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__system_data;} public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { - arg_hash.Load(url); + arg_hash.Load(url.Qargs_ary()); byte[] file_type = arg_hash.Get_val_bry_or(Arg_type, null); if (file_type == null) return; Byte_obj_val type_val = (Byte_obj_val)type_hash.Get_by_bry(file_type); if (type_val == null) return; Io_url file_url = Path_from_type(wiki, type_val.Val()); if (file_url == null) return; @@ -46,7 +47,7 @@ public class System_data_page implements Xows_page { private static final byte[] Arg_type = Bry_.new_a7("type"); private static final byte Type_log_session = 1, Type_cfg_app = 2, Type_cfg_lang = 3, Type_cfg_user = 4, Type_cfg_custom = 5, Type_usr_history = 6; - private static final Hash_adp_bry type_hash = Hash_adp_bry.cs_() + private static final Hash_adp_bry type_hash = Hash_adp_bry.cs() .Add_str_byte("log_session" , Type_log_session) .Add_str_byte("cfg_app" , Type_cfg_app) .Add_str_byte("cfg_lang" , Type_cfg_lang) diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url__basic__tst.java similarity index 51% rename from 400_xowa/src_310_url/gplx/xowa/Xoa_url_tst.java rename to 400_xowa/src/gplx/xowa/urls/Xoa_url__basic__tst.java index 45a908e1e..45307a51d 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url_tst.java +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url__basic__tst.java @@ -15,18 +15,18 @@ 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.*; +package gplx.xowa.urls; import gplx.*; import gplx.xowa.*; import org.junit.*; -public class Xoa_url_tst { - Xoa_url_fxt fxt = new Xoa_url_fxt(); - @Before public void init() {fxt.Clear();} +public class Xoa_url__basic__tst { + private final Xoa_url_fxt fxt = new Xoa_url_fxt(); @Test public void Eq_page() { - fxt.Eq_page_tst(fxt.url_("en.wikipedia.org", "Earth", false), fxt.url_("en.wikipedia.org", "Earth", false), true); - fxt.Eq_page_tst(fxt.url_("en.wikipedia.org", "Earth", false), fxt.url_("en.wikipedia.org", "Earth", true ), false); + fxt.Test_eq_page(Bool_.Y, "en.wikipedia.org/wiki/A?redirect=yes", "en.wikipedia.org/wiki/A?redirect=yes"); + fxt.Test_eq_page(Bool_.N, "en.wikipedia.org/wiki/A?redirect=no" , "en.wikipedia.org/wiki/A?redirect=yes"); } } -class Xoa_url_fxt { - public void Clear() {} - public Xoa_url url_(String wiki_str, String page_str, boolean redirect_force) {return Xoa_url.blank_().Wiki_bry_(Bry_.new_u8(wiki_str)).Page_bry_(Bry_.new_u8(page_str)).Redirect_force_(redirect_force);} - public void Eq_page_tst(Xoa_url lhs, Xoa_url rhs, boolean expd) {Tfds.Eq(expd, lhs.Eq_page(rhs));} +class Xoa_url_fxt extends Xoa_url_parser_fxt { public void Test_eq_page(boolean expd, String lhs_str, String rhs_str) { + Xoa_url lhs_url = parser.Parse(Bry_.new_u8(lhs_str)); + Xoa_url rhs_url = parser.Parse(Bry_.new_u8(rhs_str)); + Tfds.Eq_bool(expd, lhs_url.Eq_page(rhs_url), "Eq_page"); + } } diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url__to_str__tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url__to_str__tst.java new file mode 100644 index 000000000..e9d0f8bb9 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url__to_str__tst.java @@ -0,0 +1,56 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; import gplx.xowa.html.hrefs.*; +public class Xoa_url__to_str__tst { + private final Xoa_url__to_str__fxt fxt = new Xoa_url__to_str__fxt(); + @Test public void Http() {fxt.Chk_to_str_href(Bool_.N, "http://a.org/b" , "http://a.org/b");} + @Test public void File() {fxt.Chk_to_str_href(Bool_.N, "file:///C/xowa/file/a.png" , "file:///C/xowa/file/a.png");} + @Test public void Abrv__page() {fxt.Chk_to_str_href(Bool_.N, "/wiki/A" , "A");} + @Test public void Abrv__anch() {fxt.Chk_to_str_href(Bool_.N, "#b" , "#b");} + @Test public void Full__page() {fxt.Chk_to_str_href(Bool_.Y, "/wiki/A" , "en.wikipedia.org/wiki/A");} + @Test public void Full__anch() {fxt.Chk_to_str_href(Bool_.Y, "#b" , "en.wikipedia.org/wiki/Page_1#b");} + @Test public void Vnt() { + Xowe_wiki zh_wiki = fxt.Prep_create_wiki("zh.wikipedia.org"); + zh_wiki.Lang().Vnt_mgr().Enabled_(true); + zh_wiki.Lang().Vnt_mgr().Vnt_grp_(Bry_.Ary("zh-hans", "zh-hant")); + fxt.Chk_to_str_href(zh_wiki, Bool_.Y, "/site/zh.wikipedia.org/zh-hans/A" , "zh.wikipedia.org/zh-hans/A"); + fxt.Chk_to_str_href(zh_wiki, Bool_.Y, "/site/zh.wikipedia.org/zh-hant/A" , "zh.wikipedia.org/zh-hant/A"); + fxt.Chk_to_str_href(zh_wiki, Bool_.Y, "/site/zh.wikipedia.org/zh-cn/A" , "zh.wikipedia.org/wiki/A"); + fxt.Chk_to_str_href(zh_wiki, Bool_.Y, "/site/zh.wikipedia.org/wiki/A" , "zh.wikipedia.org/wiki/A"); + } + @Test public void Xwiki() { + fxt.Prep_add_xwiki_to_user("fr.wikipedia.org"); + fxt.Chk_to_str_href(Bool_.N, "/site/fr.wikipedia.org/wiki/Page", "fr.wikipedia.org/wiki/Page"); + } + @Test public void Alias() { + fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org"); + Xow_wiki en_d = fxt.Prep_create_wiki("en.wiktionary.org"); + en_d.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Id_all); + fxt.Chk_to_str_href(Bool_.N, "/wiki/wikt:a" , "en.wiktionary.org/wiki/a"); + } + @Test public void Unknown() {fxt.Chk_to_str_href(Bool_.N, "/wiki/{{{extlink}}}" , "");} // {{{extlink}}} not a valid title; return empty +} +class Xoa_url__to_str__fxt extends Xoa_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser(); + public void Chk_to_str_href(boolean full, String raw, String expd) {Chk_to_str_href(cur_wiki, full, raw, expd);} + public void Chk_to_str_href(Xowe_wiki wiki, boolean full, String raw, String expd) { + href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), wiki, Bry__page); + this.Chk_to_str(full, expd); + } + private static final byte[] Bry__page = Bry_.new_a7("Page_1"); +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java new file mode 100644 index 000000000..ef68acf3d --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java @@ -0,0 +1,311 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import gplx.core.primitives.*; import gplx.core.net.*; +import gplx.xowa.html.hrefs.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.files.*; +public class Xoa_url_parser { + private final Url_encoder encoder; + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url gfo_url = new Gfo_url(); + private final Xoa_app app; private final Xow_wiki wiki; private final byte[] domain_bry; + private byte tmp_protocol_tid; + private int tmp_tid; + private byte[] tmp_raw, tmp_wiki, tmp_page, tmp_anch, tmp_protocol_bry; private Gfo_qarg_itm[] tmp_qargs; + private byte[][] tmp_segs; private int tmp_segs_len; + private boolean tmp_protocol_is_relative, tmp_page_is_main, tmp_wiki_is_missing; + private byte[] tmp_vnt; + private final Xol_vnt_mgr vnt_mgr; + public Xoa_url_parser(Xow_wiki wiki) { + this.app = wiki.App(); + this.wiki = wiki; this.domain_bry = wiki.Domain_bry(); + this.encoder = app.Utl__encoder_mgr().Xourl(); + this.vnt_mgr = wiki.Lang().Vnt_mgr(); + } + public Xoa_url Parse_by_urlbar(String str) { + Xoae_app app = (Xoae_app)wiki.App(); + byte[] bry = Strip_mobile_segment(Bry_.new_u8(str)); + byte[] fmt = app.Gui_mgr().Url_macro_mgr().Fmt_or_null(bry); + if (fmt != null) bry = fmt; + // if (app.Wiki_mgr().Wiki_regy().Url_is_invalid_domain(rv)) { // handle lang_code entered; EX: "war" should redirect to "war" article in current wiki, not war.wikipedia.org; DATE:2014-02-07 + // rv.Page_bry_(rv.Wiki_bry()); + // rv.Wiki_bry_(wiki.Domain_bry()); + // } + return this.Parse(bry); + } + public Gfo_url_parser Url_parser() {return url_parser;} + public Xoa_url Parse(byte[] src) {Xoa_url rv = Xoa_url.blank(); Parse(rv, src); return rv;} + public Xoa_url Parse(byte[] src, int bgn, int end) {Xoa_url rv = Xoa_url.blank(); Parse(rv, src, bgn, end, false); return rv;} + public boolean Parse(Xoa_url rv, byte[] src) {return Parse(rv, src, 0, src.length, false);} + public boolean Parse(Xoa_url rv, byte[] src, int bgn, int end) {return Parse(rv, src, bgn, end, false);} + private boolean Parse(Xoa_url rv, byte[] src, int bgn, int end, boolean get_main_page) { + if (end - bgn == 0) {Init_tmp_vars(Gfo_url.Empty); Make(rv); return false;} + src = encoder.Decode(src, bgn, end); // NOTE: must decode any url-encoded parameters + int src_len = src.length; + url_parser.Parse(gfo_url, src, 0, src_len); // parse to plain gfo_url + Init_tmp_vars(gfo_url); + if (src[0] == Byte_ascii.Hash) // src is anch; EX: #A + Bld_anch(); + else { + switch (tmp_protocol_tid) { + case Gfo_protocol_itm.Tid_file: + if (src_len > 5 && src[5] != Byte_ascii.Slash) // src is ttl in [[File]] ns; EX: "File:A.png" + Bld_page_by_file_ns(); + else // src is file:///; EX: EX: "file:///C:/A.png" + tmp_tid = Xoa_url_.Tid_file; + break; + case Gfo_protocol_itm.Tid_xowa: + Bld_xowa(); + break; + case Gfo_protocol_itm.Tid_http: + case Gfo_protocol_itm.Tid_https: + case Gfo_protocol_itm.Tid_relative_1: + if (tmp_protocol_tid == Gfo_protocol_itm.Tid_relative_1) // interpret relative protocol links to match wiki's protocol; EX: [//a.org] -> https://a.org for all WMF wikis; DATE:2015-07-27 + tmp_protocol_tid = wiki.Props().Protocol_tid(); + if (app.User().Wikii().Xwiki_mgr().Get_by_key(tmp_wiki) != null)// src is offline wiki; EX: http://fr.wikipedia.org/wiki/A + Bld_page(0); + else if (Bry_.Eq(tmp_wiki, Bry_upload_wikimedia_org)) // src is upload.wikimedia.org; EX: "http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg" + Bld_page_from_upload_wikimedia_org(); + else // src is unknown site: EX: "http://a.org" + tmp_tid = Xoa_url_.Tid_inet; + break; + case Gfo_protocol_itm.Tid_unknown: + Bld_page(0); + break; + default: + tmp_tid = Xoa_url_.Tid_inet; + break; + } + } + if (tmp_page_is_main) { // Main_Page requested; EX: "zh.wikipedia.org"; "zh.wikipedia.org/wiki/"; DATE:2014-02-16 + if (get_main_page) { + Xow_wiki actl_wiki = app.Wiki_mgri().Get_by_key_or_make_init_y(tmp_wiki); // NOTE: must call Init_assert to load Main_Page; only call if from url_bar, else all sister wikis will be loaded when parsing Sister_wikis panel + tmp_page = actl_wiki.Props().Main_page(); + } + else + tmp_page = Xoa_page_.Main_page_bry_empty; + } + Bld_qargs(); + if (tmp_anch != null) { + byte[] anchor_bry = Xoa_app_.Utl__encoder_mgr().Id().Encode(tmp_anch); // reencode for anchors (which use . encoding, not % encoding); PAGE:en.w:Enlightenment_Spain#Enlightened_despotism_.281759%E2%80%931788.29 + tmp_anch = anchor_bry; + } + Make(rv); + return true; + } + private void Init_tmp_vars(Gfo_url gfo_url) { + tmp_tid = Xoa_url_.Tid_unknown; + tmp_raw = gfo_url.Raw(); + tmp_wiki = gfo_url.Segs__get_at_1st(); + tmp_page = gfo_url.Segs__get_at_nth(); + tmp_anch = gfo_url.Anch(); tmp_qargs = gfo_url.Qargs(); + tmp_wiki_is_missing = false; + tmp_page_is_main = false; + tmp_protocol_tid = gfo_url.Protocol_tid(); + tmp_protocol_bry = gfo_url.Protocol_bry(); + tmp_protocol_is_relative = gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_relative_1; // gfo_url.Protocol_is_relative(); + if (tmp_protocol_is_relative) tmp_protocol_tid = Gfo_protocol_itm.Tid_https; + tmp_vnt = null; + tmp_segs = gfo_url.Segs(); + tmp_segs_len = tmp_segs.length; + } + private Xoa_url Make(Xoa_url rv) { + rv.Ctor + ( tmp_tid, tmp_raw, tmp_protocol_tid, tmp_protocol_bry, tmp_protocol_is_relative + , tmp_wiki, tmp_page, tmp_qargs, tmp_anch + , tmp_segs, tmp_vnt, tmp_wiki_is_missing, Bry_.Eq(tmp_wiki, wiki.Domain_bry()), tmp_page_is_main); + return rv; + } + private void Bld_anch() { + tmp_tid = Xoa_url_.Tid_anch; + tmp_wiki = domain_bry; tmp_wiki_is_missing = true; + tmp_page = Bry_.Empty; + } + private void Bld_xowa() { + tmp_tid = Xoa_url_.Tid_xcmd; + tmp_page = Bry_.Mid(tmp_raw, Gfo_protocol_itm.Len_xcmd); // NOTE: just get String after protocol; anchor (#) or query params (?) must not be parsed + tmp_page = Xoa_app_.Utl__encoder_mgr().Gfs().Decode(tmp_page); // NOTE: should be decoded; EX: %20 -> " " + } + private void Bld_page_by_file_ns() { + tmp_tid = Xoa_url_.Tid_page; + tmp_segs[0] = Bry_.Add(Bry_file, tmp_wiki); + tmp_page = Make_page_from_segs(0); + tmp_wiki = domain_bry; tmp_wiki_is_missing = true; + } + private void Bld_page_from_upload_wikimedia_org() { + // orig: https://upload.wikimedia.org/wikipedia/commons/a/ab/A.jpg + // thum: https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/A.jpg/220px-A.jpg + byte[] domain_type = tmp_segs[1]; // seg[0] = type; EX: "/wikipedia/" + byte[] lang = tmp_segs[2]; // seg[1] = lang; EX: "en", "fr"; "commons" + if (Bry_.Eq(lang, Xow_domain_type_.Key_bry_commons)) // commons links will have fmt of "/wikipedia/commons"; must change to wikimedia + domain_type = Xow_domain_type_.Key_bry_wikimedia; + tmp_wiki = tmp_bfr.Clear() + .Add(lang).Add_byte(Byte_ascii.Dot) // add lang/type + .; EX: "en."; "fr."; "commons." + .Add(domain_type).Add(Bry_dot_org) // add type + .org; EX: "wikipedia.org"; "wikimedia.org"; + .Xto_bry_and_clear(); + if (tmp_segs_len > 6 && Bry_.Eq(tmp_segs[3], Xof_url_bldr.Bry_thumb)) tmp_page = tmp_segs[6]; // if "/thumb/", set page from seg[n-1] to seg[6]; EX: using thumb example above, "A.jpg", not "220px-A.jpg" + tmp_page = Bry_.Add(Bry_file, tmp_page); // always add "File:" ns + } + private boolean Find_wiki(byte[] domain) { + Xow_xwiki_itm xwiki = app.User().Wikii().Xwiki_mgr().Get_by_key(domain); // check if tmp_wiki is known wiki + if (xwiki != null) { + if (!Bry_.Eq(xwiki.Domain_bry(), domain)) // ignore aliases by checking that xwiki.domain == wiki; avoids false lang matches like "so/page" or "C/page"; PAGE: ca.s:So/Natura_del_so; DATE:2014-04-26; PAGE:no.b:C/Variabler; DATE:2014-10-14 + xwiki = null; + } + if (xwiki != null) return true; + if (app.Wiki_mgri().Has(domain)) return true; + return Byte_.In(tmp_protocol_tid, Gfo_protocol_itm.Tid_http, Gfo_protocol_itm.Tid_https); + } + private void Bld_page(int bgn_seg) { + tmp_tid = Xoa_url_.Tid_page; + tmp_wiki = tmp_segs[bgn_seg]; // try seg[0] as wiki + int seg_idx = bgn_seg + 1; + boolean wiki_exists = Find_wiki(tmp_wiki); + if (wiki_exists) { + int tmp_seg_idx = Bld_main_page_or_vnt(bgn_seg); + seg_idx = tmp_seg_idx; + int tmp_vnt_seg = bgn_seg + 1; + if (vnt_mgr.Enabled() && tmp_vnt_seg < tmp_segs_len && vnt_mgr.Vnt_grp().Has(tmp_segs[tmp_vnt_seg])) { // check if "/zh-hans/" + tmp_vnt = tmp_segs[tmp_vnt_seg]; + } + if (tmp_seg_idx == -1) return; // main_page or vnt; exit + } + else { + tmp_wiki = domain_bry; // tmp_wiki is current + tmp_wiki_is_missing = true; + --seg_idx; // move seg_idx back to wiki + } + tmp_page = tmp_segs[seg_idx]; + byte[] frag = Bld_page_by_alias(tmp_page); // handle en.wikipedia.org/wiki/fr:A + if (frag != null) { + tmp_segs[seg_idx] = frag; // alias found; set page to rhs; EX: "fr:A" -> "A" + if (frag.length == 0) // handle main_page; EX: "fr:" + tmp_page_is_main = true; + } + tmp_page = Make_page_from_segs(seg_idx); // join segs together; needed for nesting; EX: A/B/C + } + private int Bld_main_page_or_vnt(int bgn_seg) { + int rv = -1; + switch (tmp_segs_len - bgn_seg) { + case 1: // "en.wikipedia.org" + if (Bry_.Eq(tmp_segs[0 + bgn_seg], Xow_domain_.Domain_bry_home)) { // ignore "home" which should always go to "home" of current wiki, not "home" wiki + tmp_wiki = domain_bry; + return 0; + } + else { + tmp_page_is_main = true; + return -1; + } + case 2: // "en.wikipedia.org/"; "en.wikipedia.org/wiki"; "en.wikipedia.org/A" + if (Bry_.Len_eq_0(tmp_segs[1 + bgn_seg])) { // check for "en.wikipedia.org/" + tmp_page_is_main = true; + return -1; + } + else + rv = 1; + break; + case 3: + if (Bry_.Len_gt_0(tmp_segs[2 + bgn_seg])) // check only for "en.wikipedia.org/wiki/" where seg[2] is blank + return 2; + else + rv = 2; + break; + default: + return 2; + } + byte[] mid = tmp_segs[1 + bgn_seg]; + if (Bry_.Eq(mid, Bry_wiki)) { // check if "/wiki/" + tmp_page_is_main = true; + return -1; + } + else + return rv; + } + private byte[] Bld_page_by_alias(byte[] bry) { + if (bry == null) return null; + int colon_pos = Bry_finder.Find_fwd(bry, Byte_ascii.Colon); // check for colon; EX: commons:Earth + if (colon_pos == Bry_.NotFound) return null; // no colon + Xow_xwiki_itm alias_itm = wiki.Xwiki_mgr().Get_by_mid(bry, 0, colon_pos); // check for alias; + if (alias_itm == null) return null; // colon-word is not alias; EX:A:B + Xow_ns_mgr ns_mgr = tmp_wiki_is_missing ? wiki.Ns_mgr() : wiki.App().Meta_mgr().Ns_mgr().Get_or_load(tmp_wiki); + if (ns_mgr.Names_get_or_null(alias_itm.Key_bry()) != null) // special case to handle collision between "wikipedia" alias and "Wikipedia" namespace; if alias exists as ns, ignore it; EX:sv.wikipedia.org/wiki/Wikipedia:Main_Page DATE:2015-07-31 + return null; + byte[] rv = Bry_.Mid(bry, colon_pos + 1); + tmp_wiki = alias_itm.Domain_bry(); + return rv; + } + private void Bld_qargs() { + int qargs_len = tmp_qargs.length; + for (int i = 0; i < qargs_len; ++i) { + Gfo_qarg_itm qarg = tmp_qargs[i]; + if ( Bry_.Eq(qarg.Key_bry(), Qarg__title) + && qarg.Val_bry() != null // HACK: handle "bad-urls" from xml-encoded entities where page is null b/c = is encoded as =; http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template standardisation/demometa DATE:2015-08-02 + ) + tmp_page = qarg.Val_bry(); // handle /w/index.php?title=Earth + } + } + private byte[] Make_page_from_segs(int bgn) { + if (tmp_segs_len - bgn == 1) return tmp_segs[tmp_segs_len - 1]; // only 1 item; just return it; don't build bry + for (int i = bgn; i < tmp_segs_len; i++) { + if (i != bgn) tmp_bfr.Add_byte(Byte_ascii.Slash); + tmp_bfr.Add(tmp_segs[i]); + } + return tmp_bfr.Xto_bry_and_clear(); + } + public String Build_str(Xoa_url url) { // transform to "canonical" form that fits url box for both XOWA and Mozilla Firefox + tmp_bfr.Add(url.Wiki_bry()); // add wiki; EX: "en.wikipedia.org" + tmp_bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/" EX: "/wiki/" + tmp_bfr.Add(encoder.Decode(url.Page_bry())); // add page; EX: "A" + int args_len = url.Qargs_ary().length; + if (args_len > 0) { + for (int i = 0; i < args_len; i++) { + byte dlm = i == 0 ? Byte_ascii.Question : Byte_ascii.Amp; + tmp_bfr.Add_byte(dlm); + Gfo_qarg_itm arg = url.Qargs_ary()[i]; + tmp_bfr.Add(arg.Key_bry()).Add_byte(Byte_ascii.Eq).Add(arg.Val_bry()); + } + } + if (url.Anch_bry() != null) + tmp_bfr.Add_byte(Byte_ascii.Hash).Add(url.Anch_bry()); // add anchor; EX: "#B" + return tmp_bfr.Xto_str_and_clear(); + } + private static byte[] Strip_mobile_segment(byte[] v) {// DATE:2014-05-03 + int pos = Bry_finder.Find_fwd(v, Byte_ascii.Dot); + if ( pos == Bry_finder.Not_found // no dot; EX: "A" + || pos + 2 >= v.length // not enough space for .m.; EX: "A.b" + ) + return v; + switch (v[pos + 1]) { // check for m + case Byte_ascii.Ltr_M: + case Byte_ascii.Ltr_m: + break; + default: + return v; + } + if (v[pos + 2] != Byte_ascii.Dot) return v; + return Bry_.Add(Bry_.Mid(v, 0, pos), Bry_.Mid(v, pos + 2)); // skip ".m" + } + private static final byte[] Qarg__title = Bry_.new_a7("title"); + private static final byte[] + Bry_upload_wikimedia_org = Bry_.new_a7("upload.wikimedia.org") + , Bry_dot_org = Bry_.new_a7(".org") + , Bry_file = Bry_.new_a7("File:") // NOTE: File does not need i18n; is a canonical namespace + , Bry_wiki = Bry_.new_a7("wiki") + ; +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__proto_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__proto_tst.java new file mode 100644 index 000000000..719650520 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__proto_tst.java @@ -0,0 +1,42 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__proto_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Relative() { + tstr.Run_parse("//en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void Http__basic() { + tstr.Run_parse("http://en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void Upload__basic() { + tstr.Prep_add_xwiki_to_user("commons.wikimedia.org"); // NOTE: need to add xwiki to be able to resolve "/commons/" + tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg").Chk_wiki("commons.wikimedia.org").Chk_page("File:C.svg"); // orig + tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/A.png/220px-A.png").Chk_wiki("commons.wikimedia.org").Chk_page("File:A.png"); // thum + } + @Test public void File__basic() { + tstr.Run_parse("file:///C:/a/b/c").Chk_tid(Xoa_url_.Tid_file); + } + @Test public void Ftp__basic() { + tstr.Run_parse("ftp://en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_inet); + } + @Test public void Extended() { + tstr.Run_parse("http://en.wikipedia.org/w/index.php?A=B").Chk_wiki("en.wikipedia.org").Chk_page("index.php").Chk_qargs("?A=B").Chk_anch(null); + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__qarg_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__qarg_tst.java new file mode 100644 index 000000000..3e5e54f9d --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__qarg_tst.java @@ -0,0 +1,59 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__qarg_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Redirect() { + tstr.Run_parse("A?redirect=no").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?redirect=no"); + } + @Test public void Action_is_edit() { + tstr.Run_parse("A?action=edit").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_action_is_edit_y(); + } + @Test public void Assert_state_cleared() { // PURPOSE.fix: action_is_edit (et. al.) was not being cleared on parse even though Xoa_url reused; DATE:20121231 + tstr.Run_parse("A?action=edit") .Chk_action_is_edit_y(); + tstr.Run_parse_reuse("B") .Chk_action_is_edit_n(); + } + @Test public void Query_arg() { // PURPOSE.fix: query args were not printing out + tstr.Run_parse("en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes").Chk_build_str_is_same(); + } + @Test public void Dupe_key() { + tstr.Run_parse("A?B=C1&B=C2").Chk_page("A").Chk_qargs("?B=C1&B=C2"); + } + @Test public void Question_is_eos() { + tstr.Run_parse("A?").Chk_wiki("en.wikipedia.org").Chk_page("A?").Chk_qargs(""); + } + @Test public void Question_is_page() { + tstr.Run_parse("A?B").Chk_wiki("en.wikipedia.org").Chk_page("A?B").Chk_qargs(""); + } + @Test public void Question_is_anchor() { + tstr.Run_parse("A#b?c").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b.3Fc"); + } + @Test public void Title_remove_w() { // PURPOSE: fix /w/ showing up as seg; DATE:2014-05-30 + tstr.Run_parse("http://en.wikipedia.org/w/index.php?title=A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void Search() { + tstr.Run_parse("Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Chk_page("Special:Search/Moon").Chk_qargs("?fulltext=y&xowa_page_index=1"); + } + @Test public void Ctg() { + tstr.Run_parse("Category:A?pagefrom=A#mw-pages").Chk_page("Category:A").Chk_qargs("?pagefrom=A").Chk_anch("mw-pages"); + } + @Test public void Encoded() { + tstr.Run_parse("en.wikipedia.org/wiki/A?action=edit&preload=B").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?action==edit=&preload=&=").Chk_anch("61.3BB"); // NOTE: this is wrong; fix later + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__ttl_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__ttl_tst.java new file mode 100644 index 000000000..f821ac249 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__ttl_tst.java @@ -0,0 +1,56 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__ttl_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Name() { + tstr.Run_parse("A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void Sub_1() { + tstr.Run_parse("A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b"); + } + @Test public void Sub_2() { + tstr.Run_parse("A/b/c").Chk_wiki("en.wikipedia.org").Chk_page("A/b/c"); + } + @Test public void Anch() { + tstr.Run_parse("A#b").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b"); + } + @Test public void Anch_w_slash() { // PURPOSE: A/b#c/d was not parsing correctly; PAGE:en.w:Enlightenment_Spain#Enlightened_despotism_.281759%E2%80%931788.29 + tstr.Run_parse("A/b#c/d").Chk_page("A/b").Chk_anch("c.2Fd"); + } + @Test public void Ns_category() { + tstr.Run_parse("Category:A").Chk_wiki("en.wikipedia.org").Chk_page("Category:A"); + } + @Test public void Main_page__basic() { + tstr.Run_parse("en.wikipedia.org") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); + tstr.Run_parse("en.wikipedia.org/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); + tstr.Run_parse("en.wikipedia.org/wiki") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); + tstr.Run_parse("en.wikipedia.org/wiki/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); + tstr.Run_parse("en.wikipedia.org/wiki/A") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_n(); + } + @Test public void Ns_file__basic() {// PURPOSE: "File:A" should not be mistaken for "file:///" ns + tstr.Run_parse("File:A").Chk_wiki("en.wikipedia.org").Chk_page("File:A"); + } + @Test public void Ns_file__nested() {// PURPOSE: handle fictitious "File:A/B/C.png" + tstr.Run_parse("File:A/B/C.png").Chk_wiki("en.wikipedia.org").Chk_page("File:A/B/C.png"); // should not be C.png b/c of Gfo_url_parser_old + } + @Test public void Anch__basic() {// DATE:2015-07-26 + tstr.Run_parse("#A").Chk_tid(Xoa_url_.Tid_anch).Chk_wiki_is_missing(true).Chk_page("").Chk_anch("A"); + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__url_bar_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__url_bar_tst.java new file mode 100644 index 000000000..c3d09beb0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__url_bar_tst.java @@ -0,0 +1,57 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__url_bar_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Basic() { + tstr.Run_parse_from_url_bar("Page_1").Chk_to_str("en.wikipedia.org/wiki/Page_1"); // basic + } + @Test public void Lang() { + tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org"); + tstr.Run_parse_from_url_bar("uk").Chk_to_str("en.wikipedia.org/wiki/uk"); // lang-like page (uk=Ukraine) should not try to open wiki; DATE:2014-02-07 + } + @Test public void Lang_like() { + tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org", "http://~{1}.wikipedia.org"); // NOTE: fmt needed for Type_is_lang + tstr.Run_parse_from_url_bar("uk/A").Chk_to_str("en.wikipedia.org/wiki/uk/A"); // uk/A should not try be interpreted as wiki="uk" page="A"; DATE:2014-04-26 + } + @Test public void Macro() { + tstr.Prep_add_xwiki_to_user("fr.wikisource.org"); + tstr.Run_parse_from_url_bar("fr.s:Auteur:Shakespeare").Chk_to_str("fr.wikisource.org/wiki/Auteur:Shakespeare"); // url_macros + } + @Test public void Main_page__home() { + tstr.Run_parse_from_url_bar("home").Chk_to_str("en.wikipedia.org/wiki/home"); // home should go to current wiki's home; DATE:2014-02-09 + tstr.Run_parse_from_url_bar("home/wiki/Main_Page").Chk_to_str("home/wiki/Main_Page"); // home Main_Page should go to home; DATE:2014-02-09 + } + @Test public void Main_page__zhw() { + Xowe_wiki zh_wiki = tstr.Prep_create_wiki("zh.wikipedia.org"); + zh_wiki.Props().Main_page_(Bry_.new_a7("Zh_Main_Page")); + tstr.Run_parse_from_url_bar("zh.w:Main_Page") .Chk_page_is_main_n().Chk_to_str("zh.wikipedia.org/wiki/Main_Page"); + tstr.Run_parse_from_url_bar("zh.w:") .Chk_page_is_main_y().Chk_to_str("zh.wikipedia.org/wiki/"); + tstr.Run_parse_from_url_bar("en.w:") .Chk_page_is_main_y().Chk_to_str("en.wikipedia.org/wiki/"); // old bug: still stuck at zh main page due to reused objects + } + @Test public void Mobile() { // PURPOSE: handle mobile links; DATE:2014-05-03 + tstr.Run_parse_from_url_bar("en.m.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // basic + tstr.Run_parse_from_url_bar("en.M.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // upper + tstr.Run_parse_from_url_bar("A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // bounds-check: 0 + tstr.Run_parse_from_url_bar("A." ).Chk_to_str("en.wikipedia.org/wiki/A."); // bounds-check: 1 + tstr.Run_parse_from_url_bar("A.b" ).Chk_to_str("en.wikipedia.org/wiki/A.b"); // bounds-check: 2 + tstr.Run_parse_from_url_bar("A.b.m." ).Chk_to_str("en.wikipedia.org/wiki/A.b.m."); // false-match + tstr.Run_parse_from_url_bar("en.x.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/en.x.wikipedia.org/wiki/A"); // fail + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__wiki_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__wiki_tst.java new file mode 100644 index 000000000..95654531d --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__wiki_tst.java @@ -0,0 +1,42 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__wiki_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Basic() { + tstr.Run_parse("en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void No_wiki() { // PURPOSE: no "/wiki/" + tstr.Run_parse("en.wikipedia.org/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + } + @Test public void Nested() { + tstr.Run_parse("en.wikipedia.org/wiki/A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b"); + } + @Test public void Slash() { + tstr.Run_parse("en.wikipedia.org/wiki//A").Chk_wiki("en.wikipedia.org").Chk_page("/A"); + tstr.Run_parse("en.wikipedia.org/wiki/A//b").Chk_wiki("en.wikipedia.org").Chk_page("A//b"); + tstr.Run_parse("en.wikipedia.org/wiki///A").Chk_wiki("en.wikipedia.org").Chk_page("//A"); + } + @Test public void Vnt() { + Xowe_wiki wiki = tstr.Wiki(); + wiki.Lang().Vnt_mgr().Enabled_(true); + wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant"))); + tstr.Run_parse("en.wikipedia.org/zh-hans/A").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_vnt("zh-hans"); + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xcmd_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xcmd_tst.java new file mode 100644 index 000000000..c73bb32e0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xcmd_tst.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.urls; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__xcmd_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Basic() { + tstr.Run_parse("xowa-cmd:xowa.app.version").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("xowa.app.version"); + } + @Test public void Encoded() { + tstr.Run_parse("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c"); + } + @Test public void Ignore_anchor_and_qargs() { + tstr.Run_parse("xowa-cmd:a/b/c?d=e#f").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a/b/c?d=e#f"); + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java new file mode 100644 index 000000000..37c9a59fc --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java @@ -0,0 +1,74 @@ +/* +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; import gplx.*; import gplx.xowa.*; +import org.junit.*; +public class Xoa_url_parser__xwiki_tst { + private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); + @Test public void Commons() { // PURPOSE: "C" was being picked up as an xwiki to commons; PAGE:no.b:C/Variabler; DATE:2014-10-14 + tstr.Prep_add_xwiki_to_user("c", "commons.wikimedia.org"); // add alias of "c" + tstr.Run_parse("C/D").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("C/D"); // should use current wiki (enwiki), not xwiki to commons; also, page should be "C/D", not "D" + } + @Test public void Parse_lang() { + tstr.Prep_add_xwiki_to_wiki("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/~{0}"); + tstr.Run_parse("http://en.wikipedia.org/wiki/fr:A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("fr.wikipedia.org").Chk_page("A"); + } + @Test public void Alias_wiki() { + tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org"); + tstr.Run_parse("s:A/b/c").Chk_wiki("en.wikisource.org").Chk_page("A/b/c"); + } + @Test public void Xwiki_no_segs() { // PURPOSE: handle xwiki without full url; EX: "commons:Commons:Media_of_the_day"; DATE:2014-02-19 + tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org"); + tstr.Run_parse("s:Project:A").Chk_wiki("en.wikisource.org").Chk_page("Project:A"); + } + @Test public void Domain_only() { + tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); + tstr.Run_parse("fr.wikipedia.org").Chk_wiki("fr.wikipedia.org").Chk_page(""); + } + @Test public void Domain_and_wiki() { + tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); + tstr.Run_parse("fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page(""); + } + @Test public void Domain_and_wiki_w_http() { + tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); + tstr.Run_parse("http://fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page(""); + } + @Test public void Namespace_in_different_wiki() { // PURPOSE.fix: namespaced titles would default to default_wiki instead of current_wiki + Xowe_wiki en_s = tstr.Prep_create_wiki("en.wikisource.org"); + tstr.Run_parse(en_s, "Category:A").Chk_wiki("en.wikisource.org").Chk_page("Category:A"); + } + @Test public void Case_sensitive() { + // tstr.Run_parse("en.wikipedia.org/wiki/a").Chk_wiki("en.wikipedia.org").Chk_page("A"); // TODO: enforce case sentitive? + Xowe_wiki en_d = tstr.Prep_create_wiki("en.wiktionary.org"); + Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); + + ns_mgr.Ns_main().Case_match_(Xow_ns_case_.Id_all); + tstr.Run_parse("en.wiktionary.org/wiki/a").Chk_wiki("en.wiktionary.org").Chk_page("a"); + + ns_mgr.Ns_category().Case_match_(Xow_ns_case_.Id_all); + tstr.Run_parse("en.wiktionary.org/wiki/Category:a").Chk_wiki("en.wiktionary.org").Chk_page("Category:a"); + + tstr.Run_parse("en.wiktionary.org/wiki/A/B/C").Chk_page("A/B/C"); + } + @Test public void Xwiki__to_enwiki() { // PURPOSE: handle alias of "wikipedia" and sv.wikipedia.org/wiki/Wikipedia:Main_Page; DATE:2015-07-31 + Xowe_wiki xwiki = tstr.Prep_create_wiki("sv.wikipedia.org"); + tstr.Prep_xwiki(xwiki, "wikipedia", "en.wikipedia.org", null); + tstr.Prep_get_ns_mgr_from_meta("sv.wikipedia.org").Add_new(Xow_ns_.Id_project, "Wikipedia"); + tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("wikipedia:X"); + tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/Wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("Wikipedia:X"); + } +} diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser_fxt.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser_fxt.java new file mode 100644 index 000000000..a798dadf4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser_fxt.java @@ -0,0 +1,81 @@ +/* +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; import gplx.*; import gplx.xowa.*; +public class Xoa_url_parser_fxt { + protected final Xoae_app app; protected final Xowe_wiki cur_wiki; + protected final Xoa_url_parser parser; + protected Xoa_url actl_url; + public Xoa_url_parser_fxt() { + this.app = Xoa_app_fxt.app_(); + this.cur_wiki = Prep_create_wiki("en.wikipedia.org"); + this.parser = cur_wiki.Utl__url_parser(); + this.actl_url = Xoa_url.blank(); // default to blank for subclasses + } + public Xoae_app App() {return app;} + public Xowe_wiki Wiki() {return cur_wiki;} + public Xowe_wiki Prep_create_wiki(String domain) { + Xowe_wiki rv = Xoa_app_fxt.wiki_(app, domain); + Prep_add_xwiki_to_user(domain); + return rv; + } + public Xoa_url_parser_fxt Prep_add_xwiki_to_wiki(String alias, String domain) {return Prep_xwiki(cur_wiki, alias, domain, null);} + public Xoa_url_parser_fxt Prep_add_xwiki_to_wiki(String alias, String domain, String fmt) {return Prep_xwiki(cur_wiki, alias, domain, fmt);} + public Xoa_url_parser_fxt Prep_add_xwiki_to_user(String domain) {return Prep_xwiki(app.Usere().Wiki(), domain, domain, null);} + public Xoa_url_parser_fxt Prep_add_xwiki_to_user(String alias, String domain) {return Prep_xwiki(app.Usere().Wiki(), alias, domain, null);} + public Xoa_url_parser_fxt Prep_add_xwiki_to_user(String alias, String domain, String fmt) {return Prep_xwiki(app.Usere().Wiki(), alias, domain, fmt);} + public Xoa_url_parser_fxt Prep_xwiki(Xow_wiki wiki, String alias, String domain, String fmt) { + wiki.Xwiki_mgr().Add_full(Bry_.new_u8(alias), Bry_.new_u8(domain), Bry_.new_u8_safe(fmt)); + return this; + } + public Xow_ns_mgr Prep_get_ns_mgr_from_meta(String wiki) { + return app.Meta_mgr().Ns_mgr().Get_or_load(Bry_.new_u8(wiki)); + } + public Xoa_url_parser_fxt Run_parse(String actl_str) {return Run_parse(cur_wiki, actl_str);} + public Xoa_url_parser_fxt Run_parse(Xow_wiki wiki, String actl_str) { + this.actl_url = wiki.Utl__url_parser().Parse(Bry_.new_u8(actl_str)); + return this; + } + public Xoa_url_parser_fxt Run_parse_reuse(String actl_str) { + this.actl_url = parser.Parse(Bry_.new_u8(actl_str)); + return this; + } + public Xoa_url_parser_fxt Run_parse_from_url_bar(String raw) { + this.actl_url = parser.Parse_by_urlbar(raw); + return this; + } + public Xoa_url_parser_fxt Chk_tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;} + public Xoa_url_parser_fxt Chk_vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;} + public Xoa_url_parser_fxt Chk_wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;} + public Xoa_url_parser_fxt Chk_wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;} + public Xoa_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;} + public Xoa_url_parser_fxt Chk_qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;} + public Xoa_url_parser_fxt Chk_page_is_main_y() {return Chk_page_is_main(Bool_.Y);} + public Xoa_url_parser_fxt Chk_page_is_main_n() {return Chk_page_is_main(Bool_.N);} + public Xoa_url_parser_fxt Chk_page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;} + public Xoa_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;} + public Xoa_url_parser_fxt Chk_action_is_edit_y() {return Chk_action_is_edit_(Bool_.Y);} + public Xoa_url_parser_fxt Chk_action_is_edit_n() {return Chk_action_is_edit_(Bool_.N);} + private Xoa_url_parser_fxt Chk_action_is_edit_(boolean v) {Tfds.Eq_bool(v, actl_url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit), "action_is_edit"); return this;} + public Xoa_url_parser_fxt Chk_to_str(String v) {return Chk_to_str(Bool_.Y, v);} + public Xoa_url_parser_fxt Chk_to_str(boolean full, String v) {Tfds.Eq_str(v, actl_url.To_bry(full, Bool_.Y), "To_bry"); return this;} + public Xoa_url_parser_fxt Chk_build_str_is_same() { + Xoa_url_parser parser = new Xoa_url_parser(cur_wiki); + Tfds.Eq_str(actl_url.Raw(), parser.Build_str(actl_url), "build_str"); + return this; + } +} 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 index 3b2ce2d08..ff862bfc9 100644 --- a/400_xowa/src/gplx/xowa/urls/encoders/Url_encoder_mgr.java +++ b/400_xowa/src/gplx/xowa/urls/encoders/Url_encoder_mgr.java @@ -26,4 +26,5 @@ public class Url_encoder_mgr { public Url_encoder Gfs() {return gfs;} private final Url_encoder gfs = Url_encoder.new_gfs_(); public Url_encoder Fsys() {return fsys;} private final Url_encoder fsys = Url_encoder.new_fsys_lnx_(); public Url_encoder Fsys_safe() {return fsys_safe;} private final Url_encoder fsys_safe = Url_encoder.new_fsys_wnt_(); + public Url_encoder Xourl() {return xourl;} private final Url_encoder xourl = Url_encoder.new_html_href_mw_().Itms_raw_same_many(Byte_ascii.Underline); } diff --git a/400_xowa/src/gplx/xowa/users/Xoue_user.java b/400_xowa/src/gplx/xowa/users/Xoue_user.java index 04a74c098..f3b3a44ee 100644 --- a/400_xowa/src/gplx/xowa/users/Xoue_user.java +++ b/400_xowa/src/gplx/xowa/users/Xoue_user.java @@ -34,7 +34,7 @@ public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble { public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; public String Key() {return key;} private String key; public Xou_db_mgr User_db_mgr() {return user_db_mgr;} private final Xou_db_mgr user_db_mgr; - public Xow_wiki Wikii() {return wiki;} + public Xow_wiki Wikii() {return this.Wiki();} public int Gender() {return Xol_gender_.Tid_unknown;} public Xoae_app Appe() {return app;} private final Xoae_app app; public Xol_lang Lang() {if (lang == null) {lang = app.Lang_mgr().Get_by_key_or_new(app.Sys_cfg().Lang()); lang.Init_by_load();} return lang;} private Xol_lang lang; 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 e18222d44..2e9bbadb8 100644 --- a/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java @@ -46,7 +46,7 @@ public class Xous_window_mgr implements GfoInvkAble { 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()); + bfr.Add_str(tab.Page().Url().To_str()); } return bfr.Xto_str_and_clear(); } diff --git a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_mgr.java b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_mgr.java index f74b088c2..a925b8dcc 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_mgr.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_mgr.java @@ -27,7 +27,7 @@ public class Xoud_bmk_mgr { if (!conn.Meta_tbl_exists(tbl__itm.Tbl_name())) tbl__itm.Create_tbl(); } public void Itms__add(int owner, Xoa_url url) { - tbl__itm.Insert(owner, tbl__itm.Select_sort_next(owner), Xoa_ttl.Replace_unders(url.Page_bry()), url.Wiki_bry(), url.Raw(), Bry_.Empty); + tbl__itm.Insert(owner, tbl__itm.Select_sort_next(owner), Xoa_ttl.Replace_unders(url.Page_bry()), url.Wiki_bry(), url.To_bry(Bool_.Y, Bool_.Y), Bry_.Empty); } public static final int Owner_root = -1; } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java index 291dece55..00fdd6a9c 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java @@ -62,7 +62,7 @@ class Xoud_opt_scope_parser { usr_dlg.Warn_many("", "", fmt, String_.new_u8(src, bgn, end)); return Xoud_opt_scope.App; } - private static final Btrie_slim_mgr btrie_by_type = Btrie_slim_mgr.cs_() + private static final Btrie_slim_mgr btrie_by_type = Btrie_slim_mgr.cs() .Add_str_int("w" , Xow_domain_type_.Tid_wikipedia) .Add_str_int("d" , Xow_domain_type_.Tid_wiktionary) .Add_str_int("s" , Xow_domain_type_.Tid_wikisource) diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_itm.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_itm.java index 4e46d987d..b5d115877 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_itm.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_itm.java @@ -18,12 +18,13 @@ along with this program. If not, see . package gplx.xowa.users.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.core.primitives.*; public class Xou_history_itm { + private Xou_history_itm() {} public Xou_history_itm(byte[] wiki, byte[] page) { this.wiki = wiki; this.page = page; this.key = key_(wiki, page); this.view_bgn = DateAdp_.Now(); - } private Xou_history_itm() {} + } public byte[] Key() {return key;} private byte[] key; public byte[] Wiki() {return wiki;} private byte[] wiki; public byte[] Page() {return page;} private byte[] page; 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 abdb1ae4e..8a652dae2 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 @@ -16,12 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.users.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; -import gplx.core.primitives.*; import gplx.xowa.html.hrefs.*; +import gplx.core.primitives.*; import gplx.core.net.*; import gplx.xowa.html.hrefs.*; public class Xou_history_mgr implements GfoInvkAble { private final Xou_history_html html_mgr = new Xou_history_html(); private Xou_history_sorter sorter = new Xou_history_sorter().Sort_fld_(Xou_history_itm.Fld_view_end).Ascending_(false); private final Io_url history_fil; private Ordered_hash itms = Ordered_hash_.new_bry_(); private boolean load_chk = false; + private final Bry_bfr tmp_bfr = Bry_bfr.new_(); public Xou_history_mgr(Io_url history_fil) {this.history_fil = history_fil;} public int Len() {return itms.Count();} public void Clear() {itms.Clear();} @@ -30,7 +31,7 @@ public class Xou_history_mgr implements GfoInvkAble { if (!load_chk) Load(); int len = itms.Count(); if (len == 0) return String_.new_a7(Xoa_page_.Main_page_bry); // if no history, return Main_page (which should go to home/wiki/Main_page) Xou_history_itm itm = (Xou_history_itm)itms.Get_at(0); - return String_.new_u8(Bry_.Add(itm.Wiki(), Xoh_href_parser.Href_wiki_bry, itm.Page())); + return String_.new_u8(Bry_.Add(itm.Wiki(), Xoh_href_.Bry__wiki, itm.Page())); } public Xou_history_itm Get_or_null(byte[] wiki, byte[] page) { if (!load_chk) Load(); @@ -51,8 +52,8 @@ public class Xou_history_mgr implements GfoInvkAble { page_ttl = page.Redirected_ttls__itm_0(); else { page_ttl = Bry_.Add(ttl.Ns().Name_db_w_colon(), ttl.Page_txt()); // use ttl.Page_txt() b/c it normalizes space/casing (url.Page_txt does not) - if (url.Args().length > 0) - page_ttl = Bry_.Add(page_ttl, url.Args_all_as_bry()); + if (url.Qargs_ary().length > 0) + page_ttl = Bry_.Add(page_ttl, url.Qargs_mgr().To_bry()); } Add(url, ttl, page_ttl); } @@ -62,11 +63,18 @@ public class Xou_history_mgr implements GfoInvkAble { byte[] key = Xou_history_itm.key_(url.Wiki_bry(), page_ttl); Xou_history_itm itm = (Xou_history_itm)itms.Get_by(key); if (itm == null) { - itm = new Xou_history_itm(url.Wiki_bry(), page_ttl); + itm = new Xou_history_itm(url.Wiki_bry(), To_full_db_w_qargs(url, ttl)); itms.Add(key, itm); } itm.Tally(); } + private byte[] To_full_db_w_qargs(Xoa_url url, Xoa_ttl ttl) { + byte[] page = Xoa_ttl.Replace_spaces(ttl.Full_txt_wo_qarg()); + tmp_bfr.Add(page); + Gfo_qarg_mgr qarg_mgr = url.Qargs_mgr(); + qarg_mgr.To_bry(tmp_bfr, Xoa_app_.Utl__encoder_mgr().Href(), Bool_.N); + return tmp_bfr.Xto_bry_and_clear(); + } public void Sort() {itms.Sort_by(sorter);} public void Load() { if (load_chk) return; diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java index 57da4f1a9..d81747890 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java @@ -35,7 +35,7 @@ public class Xou_history_mgr_tst { @Test public void Normalize() { fxt.Clear(); fxt.Add_many("Category:A_B", "Category:A B", "Category:a B", "Category:_A B_"); - fxt.List_tst("Category:A B"); + fxt.List_tst("Category:A_B"); } @Test public void Args() { fxt.Clear(); @@ -70,10 +70,8 @@ class Xou_history_mgr_fxt { page.Revision_data().Modified_on_(DateAdp_.Now()); byte[] url_bry = ttl_bry; if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str)); - Xoa_url url = app.Utl__url_parser().Parse(url_bry); - url.Wiki_bry_(wiki.Domain_bry()); + Xoa_url url = wiki.Utl__url_parser().Parse(url_bry); page.Url_(url); // set url b/c history_mgr.Add uses url -// page.Url_(Xoa_url.new_(wiki.Key_bry(), url_bry)); // set url b/c history_mgr.Add uses url under.Add(page); return this; } diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java index bcbd1efd9..f232dc416 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java @@ -16,12 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.users.prefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; -import gplx.core.primitives.*; import gplx.html.*; import gplx.gfui.*; +import gplx.core.primitives.*; import gplx.core.net.*; import gplx.html.*; import gplx.gfui.*; import gplx.xowa.gui.views.*; +import gplx.xowa.urls.*; public class Prefs_mgr implements GfoInvkAble { public Prefs_mgr(Xoae_app app) { this.app = app; - atrs_hash = Hash_adp_bry.cs_(); + atrs_hash = Hash_adp_bry.cs(); atrs_hash.Add(Bry_prop, Byte_obj_val.new_(Tid_prop)); atrs_hash.Add(Bry_prop_get, Byte_obj_val.new_(Tid_prop_get)); atrs_hash.Add(Bry_prop_set, Byte_obj_val.new_(Tid_prop_set)); @@ -143,11 +144,11 @@ public class Prefs_mgr implements GfoInvkAble { public static final byte Elem_tid_null = 0, Elem_tid_input_text = 1, Elem_tid_textarea = 2, Elem_tid_input_checkbox = 3, Elem_tid_select = 4, Elem_tid_input_combo = 5, Elem_tid_input_xowa_io = 6; } class Prefs_trg_mgr { - private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); + private Gfo_qarg_mgr arg_hash = new Gfo_qarg_mgr(); public byte[] Trg_type() {return trg_type;} private byte[] trg_type; public byte[] Trg_val() {return trg_val;} private byte[] trg_val; public void Init(Xoa_url url) { - arg_hash.Load(url); + arg_hash.Load(url.Qargs_ary()); trg_type = arg_hash.Get_val_bry_or(Prefs_trg_mgr.Arg_option_trg_type_bry, null); trg_val = arg_hash.Get_val_bry_or(Prefs_trg_mgr.Arg_option_trg_val_bry, null); } diff --git a/400_xowa/src/gplx/xowa/users/wikis/Xofs_url_itm_parser.java b/400_xowa/src/gplx/xowa/users/wikis/Xofs_url_itm_parser.java index d6ea44cdf..81302a17f 100644 --- a/400_xowa/src/gplx/xowa/users/wikis/Xofs_url_itm_parser.java +++ b/400_xowa/src/gplx/xowa/users/wikis/Xofs_url_itm_parser.java @@ -25,7 +25,7 @@ class Xofs_url_itm_parser { private static final byte[] Xowa_fs_protocol = Bry_.new_a7("xowa-fs://"); private static final int Xowa_fa_protocol_len = Xowa_fs_protocol.length; private Bry_bfr url_bfr = Bry_bfr.reset_(16); - private Hash_adp_bry names = Hash_adp_bry.cs_(); + private Hash_adp_bry names = Hash_adp_bry.cs(); public byte Dir_spr() {return dir_spr;} public void Dir_spr_(byte v) {dir_spr = v;} private byte dir_spr = Op_sys.Cur().Fsys_dir_spr_byte(); public void Names_add(String key_str, String val_str) { byte[] key_bry = Bry_.new_u8(key_str); diff --git a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java index 926a320e7..dee34475e 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; public interface Xoa_wiki_mgr { + boolean Has(byte[] key); Xow_wiki Get_by_key_or_make_init_y(byte[] key); Xow_wiki Get_by_key_or_make_init_n(byte[] key); } diff --git a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_regy.java b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_regy.java index 6fc56e952..78391bdef 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_regy.java +++ b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_regy.java @@ -19,9 +19,13 @@ package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; public class Xoa_wiki_regy { private Xoae_app app; private boolean init_needed = true; - private Hash_adp_bry hash = Hash_adp_bry.cs_(); + private Hash_adp_bry hash = Hash_adp_bry.cs(); public Xoa_wiki_regy(Xoae_app app) {this.app = app;} public boolean Has(byte[] domain) {if (init_needed) Init(); return hash.Has(domain);} + public void Clear() { + hash.Clear(); + init_needed = true; + } public boolean Url_is_invalid_domain(Xoa_url url) { if (!Bry_.Eq(url.Page_bry(), Xoa_page_.Main_page_bry)) return false; // page is not "Main_Page"; assume not an invalid domain str; EX: "uk/wiki/Main_Page" if ( Bry_.Eq(Xow_domain_type_.Key_bry_home, url.Wiki_bry()) // wiki is "home" @@ -30,6 +34,7 @@ public class Xoa_wiki_regy { return !this.Has(url.Wiki_bry()); } private void Init() { + init_needed = false; Io_url[] wiki_dirs = Io_mgr.I.QueryDir_args(app.Fsys_mgr().Wiki_dir()).DirInclude_(true).Recur_(false).ExecAsUrlAry(); int wiki_dirs_len = wiki_dirs.length; for (int i = 0; i < wiki_dirs_len; i++) { @@ -37,7 +42,6 @@ public class Xoa_wiki_regy { byte[] domain_bry = Bry_.new_u8(wiki_dir.NameOnly()); hash.Add(domain_bry, domain_bry); } - init_needed = true; } public static void Make_wiki_dir(Xoa_app app, String domain_str) { // TEST: fake wiki_dir for Parse_from_url_bar; DATE:2014-02-16 Io_url wiki_dir = app.Fsys_mgr().Wiki_dir(); diff --git a/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java index 5ea09a270..d7b72b581 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java @@ -19,7 +19,7 @@ package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.wikis.domains.crts.*; public class Xoae_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { private Xoae_app app; - private List_adp list = List_adp_.new_(); private Hash_adp_bry hash = Hash_adp_bry.ci_ascii_(); // ASCII:url_domain; EX:en.wikipedia.org + private List_adp list = List_adp_.new_(); private Hash_adp_bry hash = Hash_adp_bry.ci_a7(); // ASCII:url_domain; EX:en.wikipedia.org public Xoae_wiki_mgr(Xoae_app app) { this.app = app; wiki_regy = new Xoa_wiki_regy(app); @@ -34,6 +34,7 @@ public class Xoae_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { } public int Count() {return hash.Count();} public void Del(byte[] key) {hash.Del(key);} + public boolean Has(byte[] key) {return hash.Has(key);} public Xowe_wiki Get_at(int i) {return Int_.Between(i, 0, this.Count() - 1) ? (Xowe_wiki)list.Get_at(i) : null;} public Xowe_wiki Get_by_key_or_null(byte[] key) {return Bry_.Len_eq_0(key) ? null : (Xowe_wiki)hash.Get_by(key);} public Xowe_wiki Get_by_key_or_null(byte[] src, int bgn, int end) {return (Xowe_wiki)hash.Get_by_mid(src, bgn, end);} diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_domain_.java b/400_xowa/src/gplx/xowa/wikis/Xow_domain_.java index 893921325..878a8d8be 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_domain_.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_domain_.java @@ -96,7 +96,7 @@ public class Xow_domain_ { Object o = lang_to_gfs_hash.Get_by_bry(v); return o == null ? v : (byte[])o; } - private static final Hash_adp_bry lang_to_gfs_hash = Hash_adp_bry.ci_ascii_() // ASCII:lang_code + private static final Hash_adp_bry lang_to_gfs_hash = Hash_adp_bry.ci_a7() // ASCII:lang_code .Add_str_obj("simple" , Bry_.new_a7("en")) .Add_str_obj("zh-classical" , Bry_.new_a7("lzh")) .Add_str_obj("no" , Bry_.new_a7("nb")) diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_domain_type_.java b/400_xowa/src/gplx/xowa/wikis/Xow_domain_type_.java index aeaa4429a..7479f41c9 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_domain_type_.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_domain_type_.java @@ -80,8 +80,8 @@ public class Xow_domain_type_ { , Key_bry_other = Bry_.new_a7(Key_str_other) ; private static final Xow_domain_type[] ary = new Xow_domain_type[Tid__len]; - private static final Hash_adp_bry type_regy = Hash_adp_bry.ci_ascii_(); // LOC:must go before new_() - private static final Hash_adp_bry abrv_regy = Hash_adp_bry.cs_(); // LOC:must go before new_() + private static final Hash_adp_bry type_regy = Hash_adp_bry.ci_a7(); // LOC:must go before new_() + private static final Hash_adp_bry abrv_regy = Hash_adp_bry.cs(); // LOC:must go before new_() public static final Xow_domain_type Itm_wikipedia = new_(Bool_.Y , Xow_domain_type_src_.Tid_wmf , Tid_wikipedia , Key_bry_wikipedia , "w" , ".wikipedia.org") , Itm_wiktionary = new_(Bool_.Y , Xow_domain_type_src_.Tid_wmf , Tid_wiktionary , Key_bry_wiktionary , "d" , ".wiktionary.org") diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_wiki_alias.java b/400_xowa/src/gplx/xowa/wikis/Xow_wiki_alias.java index 16ca7ce74..1bcf452a0 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_wiki_alias.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_wiki_alias.java @@ -213,7 +213,7 @@ public class Xow_wiki_alias { alias_val_hash.Add(domain_bval, alias_bry); } private static void Init_tids() { - tid_bry_trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:MW_const.en + tid_bry_trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en tid_val_hash = Hash_adp_.new_(); Init_tid(Key_pages_articles , Tid_pages_articles); Init_tid(Key_pages_meta_current , Tid_pages_meta_current); diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java index 4ba503a86..6c97c5094 100644 --- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java @@ -24,7 +24,7 @@ public class Xow_cache_mgr { defn_cache = new Xow_defn_cache(wiki.Lang()); lst_cache = new Xow_defn_cache(wiki.Lang()); } - public Hash_adp Tmpl_result_cache() {return tmpl_result_cache;} private Hash_adp tmpl_result_cache = Hash_adp_bry.cs_(); + public Hash_adp Tmpl_result_cache() {return tmpl_result_cache;} private Hash_adp tmpl_result_cache = Hash_adp_bry.cs(); public Xow_page_cache Page_cache() {return page_cache;} private Xow_page_cache page_cache; public Xow_defn_cache Defn_cache() {return defn_cache;} private Xow_defn_cache defn_cache; public Xow_defn_cache Lst_cache() {return lst_cache;} private Xow_defn_cache lst_cache; diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java index 83b4e9abe..6b926ec69 100644 --- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java +++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.wikis.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; public class Xow_page_cache { private Xowe_wiki wiki; - private Hash_adp_bry cache = Hash_adp_bry.cs_(); // NOTE: wiki titles are not case-sensitive when ns is "1st-letter" (EX: w:earth an w:Earth); in these cases, two entries will be stored + private Hash_adp_bry cache = Hash_adp_bry.cs(); // NOTE: wiki titles are not case-sensitive when ns is "1st-letter" (EX: w:earth an w:Earth); in these cases, two entries will be stored public Xow_page_cache(Xowe_wiki wiki) {this.wiki = wiki;} public byte[] Get_or_load_as_src(Xoa_ttl ttl) { Xow_page_cache_itm rv = Get_or_load_as_itm(ttl); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java index 0cb910d2e..187114699 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java @@ -27,7 +27,7 @@ public class Xowd_page_itm_tst { class Xowd_page_itm_fxt { public void Init() { if (ns_mgr == null) { - ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii()); + ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); ns_mgr.Add_new(Xow_ns_.Id_main, ""); ns_mgr.Add_new(Xow_ns_.Id_user_talk, "User talk"); ns_mgr.Init_w_defaults(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java index 5f4cd31b3..09104d1c6 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java @@ -48,7 +48,7 @@ public class Xowd_wbase_pid_tbl implements RlsAble { try { if (!rdr.Move_next()) 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 = rdr.Read_bry_by_str(fld_trg_ttl); - return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.Xto_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); + return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.To_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); } finally {rdr.Rls();} } public void Rls() { diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java index 475ac0063..a4e424bd4 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java @@ -46,7 +46,7 @@ public class Xowd_wbase_qid_tbl implements RlsAble { if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_src_wiki, fld_src_ns, fld_src_ttl); if (src_ttl_has_spaces) src_ttl = Xoa_ttl.Replace_unders(src_ttl); // NOTE: v2.4.2.1-v2.4.3.2 stores ttl in spaces ("A B"), while xowa will use under form ("A_B"); DATE:2015-04-21 Db_rdr rdr = stmt_select.Clear() - .Crt_bry_as_str(fld_src_wiki, src_wiki).Crt_int(fld_src_ns, Bry_.Xto_int(src_ns)).Crt_bry_as_str(fld_src_ttl, src_ttl) + .Crt_bry_as_str(fld_src_wiki, src_wiki).Crt_int(fld_src_ns, Bry_.To_int_or_neg1(src_ns)).Crt_bry_as_str(fld_src_ttl, src_ttl) .Exec_select__rls_manual(); try { return rdr.Move_next() ? rdr.Read_bry_by_str(fld_trg_ttl) : null; diff --git a/400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_parser.java b/400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_parser.java index ed459c314..4611c4695 100644 --- a/400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_parser.java +++ b/400_xowa/src/gplx/xowa/wikis/domains/crts/Xow_domain_crt_itm_parser.java @@ -80,7 +80,7 @@ class Xow_domain_crt_itm_parser { else return new Xow_domain_crt_itm__wiki(raw); // EX: en.wikipedia.org } - private static final Hash_adp_bry itm_hash = Hash_adp_bry.cs_() + private static final Hash_adp_bry itm_hash = Hash_adp_bry.cs() .Add_str_obj("" , Xow_domain_crt_itm__self.I) .Add_str_obj("" , Xow_domain_crt_itm__same_type.I) .Add_str_obj("" , Xow_domain_crt_itm__same_lang.I) diff --git a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java index 044f06c9e..52c2c0a44 100644 --- a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.wikis.modules; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.html.heads.*; import gplx.xowa.html.modules.popups.*; public class Xow_module_mgr implements GfoInvkAble { - private Hash_adp_bry regy = Hash_adp_bry.cs_(); + private Hash_adp_bry regy = Hash_adp_bry.cs(); public Xow_module_mgr(Xowe_wiki wiki) { this.popup_mgr = new Xow_popup_mgr(wiki); regy.Add_bry_obj(Xoh_head_itm_.Key__top_icon , itm__top_icon); diff --git a/400_xowa/src/gplx/xowa/wikis/ttls/Xow_ttl__i18n_tst.java b/400_xowa/src/gplx/xowa/wikis/ttls/Xow_ttl__i18n_tst.java index fa12b10fa..c6f73de0f 100644 --- a/400_xowa/src/gplx/xowa/wikis/ttls/Xow_ttl__i18n_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/ttls/Xow_ttl__i18n_tst.java @@ -20,24 +20,29 @@ import org.junit.*; import gplx.xowa.langs.cases.*; public class Xow_ttl__i18n_tst { @Before public void init() {fxt.Reset();} private Xow_ttl_fxt fxt = new Xow_ttl_fxt(); - @Test public void Bidi() { - fxt.Init_ttl("A" + String_.new_u8(Bry_.ints_(226, 128, 142)) + "B").Expd_page_txt("AB").Test(); - fxt.Init_ttl("A" + String_.new_u8(Bry_.ints_(226, 128, 97)) + "B").Expd_page_txt("A" + String_.new_u8(Bry_.ints_(226, 128, 97)) + "B").Test(); + @Test public void Bidi() { // PURPOSE: handle bidirectional characters; DATE:2015-07-28 + fxt.Init_ttl("A\u00E2\u0080\u008E\u00E2\u0080\u008F\u00E2\u0080\u00AA\u00E2\u0080\u00AB\u00E2\u0080\u00AC\u00E2\u0080\u00AD\u00E2\u0080\u00AEB").Expd_page_txt("AB").Test(); } @Test public void Multi_byte_char2() { // PURPOSE: multi-byte HTML entity causes array out of index error; EX: w:List_of_Unicode_characters; DATE:2013-12-25 fxt.Init_ttl("ⱥ").Expd_full_txt("ⱥ").Test(); } @Test public void First_char_is_multi_byte() { // PURPOSE: if multi-byte, uppercasing is complicated; EX: µ -> Μ; DATE:2013-11-27 - fxt.Wiki().Lang().Case_mgr_utf8_(); + fxt.Wiki().Lang().Case_mgr_u8_(); fxt.Init_ttl("µ").Expd_full_txt("Μ").Test(); // NOTE: this is not an ASCII "Μ" fxt.Init_ttl("µab").Expd_full_txt("Μab").Test(); // check that rest of title works fine fxt.Init_ttl("Help:µab").Expd_full_txt("Help:Μab").Test(); // check ns fxt.Init_ttl("Ι").Expd_full_txt("Ι").Test(); // check that Ι is not upper-cased to COMBINING GREEK YPOGEGRAMMENI; DATE:2014-02-24 } @Test public void First_char_is_multi_byte_assymetrical() { // PURPOSE: test multi-byte asymmetry (lc is 3 bytes; uc is 2 bytes) - fxt.Wiki().Lang().Case_mgr_utf8_(); + fxt.Wiki().Lang().Case_mgr_u8_(); fxt.Init_ttl("ⱥ").Expd_full_txt("Ⱥ").Test(); fxt.Init_ttl("ⱥab").Expd_full_txt("Ⱥab").Test(); // check that rest of title works fine fxt.Init_ttl("Help:ⱥab").Expd_full_txt("Help:Ⱥab").Test(); // check ns } + @Test public void Ws__basic() { // PURPOSE: replace other whitespace with underscore; PAGE:ja.w:Template:Location_map_USA New_York; DATE:2015-07-28 + fxt.Init_ttl("A B").Expd_full_txt("A B").Test(); + } + @Test public void Ws__many() { // PURPOSE: replace other whitespace with underscore; PAGE:ja.w:Template:Location_map_USA New_York; DATE:2015-07-28 + fxt.Init_ttl("A\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000B").Expd_full_txt("A B").Test(); + } } diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java index 1b5c46532..6b630361b 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java @@ -25,11 +25,11 @@ public class Xow_lang_mgr { } public Bry_fmtr Html_div() {return html_div;} private final Bry_fmtr html_div = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "
    " - , "
    ~{toggle_btn}~{wikidata_link}
    " + , "
    ~{toggle_btn} (links: ~{len}) ~{wikidata_link}
    " , " ~{grps}" , "
    " , "
    " - ), "wikidata_link", "toggle_btn", "toggle_hdr", "grps"); + ), "len", "wikidata_link", "toggle_btn", "toggle_hdr", "grps"); public Bry_fmtr Html_wikidata_link() {return html_wikidata_link;} private final Bry_fmtr html_wikidata_link = Bry_fmtr.new_(" (wikidata)", "qid"); public void Clear() {hash.Clear();} public void Itms_reg(Xow_xwiki_itm xwiki, Xoac_lang_itm lang) { @@ -111,7 +111,7 @@ class Xow_lang_html implements Bry_fmtr_arg { byte[] msg_lang = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_page_lang_header); byte[] wikidata_link = Bry_.Len_eq_0(qid) ? Bry_.Empty : lang_mgr.Html_wikidata_link().Bld_bry_many(tmp_bfr, qid); toggle_itm.Init(wiki, msg_lang); - lang_mgr.Html_div().Bld_bfr_many(bfr, wikidata_link, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), this); + lang_mgr.Html_div().Bld_bfr_many(bfr, ttl_list.Count(), wikidata_link, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), this); stage = 0; break; } @@ -141,9 +141,9 @@ class Xow_lang_html implements Bry_fmtr_arg { byte[] local_name = itm.Lang_name(); byte[] badge_cls = Badge_cls(tmp_bfr, itm.Page_badges()); if (wiki.Appe().Usere().Wiki().Xwiki_mgr().Get_by_key(domain) == null) - tmp_bfr.Add(Xoh_href_parser.Href_https_bry).Add(domain).Add(Xoh_href_parser.Href_wiki_bry); + tmp_bfr.Add(Xoh_href_.Bry__https).Add(domain).Add(Xoh_href_.Bry__wiki); else - tmp_bfr.Add(Xoh_href_parser.Href_site_bry).Add(domain).Add(Xoh_href_parser.Href_wiki_bry); + tmp_bfr.Add(Xoh_href_.Bry__site).Add(domain).Add(Xoh_href_.Bry__wiki); if (!itm.Empty_xwiki()) tmp_bfr.Add(page_name); grp.Html_itm().Bld_bfr_many(bfr, lang_key, domain, local_name, tmp_bfr.Xto_bry_and_clear(), page_name, badge_cls); ++grp_counter; @@ -183,7 +183,7 @@ class Xow_lang_html implements Bry_fmtr_arg { Badge_none_cls = Bry_.new_a7("badge-none") , Cls_bgn = Bry_.new_a7(" class='") ; - private static Hash_adp_bry badges_hash = Hash_adp_bry.ci_ascii_() + private static Hash_adp_bry badges_hash = Hash_adp_bry.ci_a7() .Add_str_obj("Q17437798", Bry_.new_a7("badge-goodarticle")) .Add_str_obj("Q17437796", Bry_.new_a7("badge-featuredarticle")) .Add_str_obj("Q17559452", Bry_.new_a7("badge-recommendedarticle")) diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr_tst.java index 7ac2184f5..42dbd57da 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr_tst.java @@ -18,12 +18,12 @@ along with this program. If not, see . package gplx.xowa.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import org.junit.*; public class Xow_lang_mgr_tst { - private Xow_lang_mgr_fxt fxt = new Xow_lang_mgr_fxt(); + private final Xow_lang_mgr_fxt fxt = new Xow_lang_mgr_fxt(); @Before public void init() {fxt.Clear();} @Test public void Basic() { fxt.tst("[[simple:Earth]] [[fr:Terre]] [[es:Tierra]] [[de:Erde]] [[it:Terre]]", String_.Concat_lines_nl_skip_last ( "
    " - , "
    In other languages
    " + , "
    In other languages (links: 5)
    " , "