diff --git a/100_core/.project b/100_core/.project deleted file mode 100644 index 71ba1b5d0..000000000 --- a/100_core/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 100_core - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/100_core/lib/commons-compress-1.5.jar b/100_core/lib/commons-compress-1.5.jar deleted file mode 100644 index 0239414e8..000000000 Binary files a/100_core/lib/commons-compress-1.5.jar and /dev/null differ diff --git a/100_core/src/gplx/Bry_.java b/100_core/src/gplx/Bry_.java index c720c0388..f8a77db71 100644 --- a/100_core/src/gplx/Bry_.java +++ b/100_core/src/gplx/Bry_.java @@ -20,9 +20,9 @@ import java.lang.*; import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.ios.*; public class Bry_ { public static final String Cls_val_name = "byte[]"; - public static final byte[] Empty = new byte[0]; - public static final byte[][] Ary_empty = new byte[0][]; - public static final Class Cls_ref_type = byte[].class; + public static final byte[] Empty = new byte[0]; + public static final byte[][] Ary_empty = new byte[0][]; + public static final Class Cls_ref_type = byte[].class; public static byte[] cast(Object val) {return (byte[])val;} public static byte[] New_by_byte(byte b) {return new byte[] {b};} public static byte[] New_by_ints(int... ary) { @@ -403,7 +403,7 @@ public class Bry_ { } return rv; } - public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space); + public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space); public static byte[] Trim(byte[] src) {return Trim(src, 0, src.length, true, true, Trim_ary_ws);} public static byte[] Trim(byte[] src, int bgn, int end) {return Trim(src, bgn, end, true, true, Trim_ary_ws);} public static byte[] Trim(byte[] src, int bgn, int end, boolean trim_bgn, boolean trim_end, byte[] trim_ary) { @@ -766,8 +766,8 @@ public class Bry_ { if (!Bry_.Eq(lhs[i], rhs[i])) return false; return true; } - 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 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 int y = 0, M = 0, d = 0, H = 0, m = 0, s = 0, f = 0; int bgn = posRef.Val(); @@ -1017,6 +1017,29 @@ public class Bry_ { } return dirty ? bfr.To_bry_and_clear() : src; } + public static byte[] Resolve_escape(Bry_bfr bfr, byte escape, byte[] raw, int bgn, int end) { + int pos = bgn; + boolean dirty = false; + while (pos < end) { + byte b = raw[pos]; + if (b == escape) { + if (!dirty) { + dirty = true; + bfr.Add_mid(raw, bgn, pos); + } + ++pos; + if (pos < end) { // check for eos; note that this ignores trailing "\"; EX: "a\" -> "a" + bfr.Add_byte(raw[pos]); + ++pos; + } + } + else { + if (dirty) bfr.Add_byte(b); + ++pos; + } + } + return dirty ? bfr.To_bry_and_clear() : raw; + } public static void Clear(byte[] bry) { int len = bry.length; for (int i = 0; i < len; ++i) diff --git a/100_core/src/gplx/Bry_bfr.java b/100_core/src/gplx/Bry_bfr.java index 2574254bc..47cbddf00 100644 --- a/100_core/src/gplx/Bry_bfr.java +++ b/100_core/src/gplx/Bry_bfr.java @@ -317,6 +317,10 @@ public class Bry_bfr { Add_str_u8(ary[i]); return this; } + public Bry_bfr Add_str_u8_fmt(String fmt, Object... args) { + Add_str_u8(String_.Format(fmt, args)); + return this; + } public Bry_bfr Add_str_a7_null(String s) {return Add_str_a7(s == null ? String_.Null_mark : s);} public Bry_bfr Add_str_a7_w_nl(String s) {Add_str_a7(s); return Add_byte_nl();} public Bry_bfr Add_str_a7(String str) { diff --git a/100_core/src/gplx/Bry_find_.java b/100_core/src/gplx/Bry_find_.java index d1fea2de2..06e14fd1d 100644 --- a/100_core/src/gplx/Bry_find_.java +++ b/100_core/src/gplx/Bry_find_.java @@ -182,7 +182,7 @@ public class Bry_find_ { return bgn; } public static int Find_bwd__skip(byte[] src, int end, int bgn, byte skip) { - int src_len = src.length; if (end == src_len) return end; + int src_len = src.length; // if (end == src_len) return end; if (end > src_len || end < 0) return Bry_find_.Not_found; int pos = end - 1; // start from end - 1; handles situations where len is passed in for (int i = pos; i >= bgn; --i) { @@ -191,6 +191,17 @@ public class Bry_find_ { } return bgn; } + public static int Find_bwd__skip(byte[] src, int end, int bgn, byte[] skip) { + int src_len = src.length; + if (end > src_len || end < 0) return Bry_find_.Not_found; + int skip_len = skip.length; + int pos = end - skip_len; // start from end - 1; handles situations where len is passed in + for (int i = pos; i >= bgn; --i) { + if (!Bry_.Eq(src, i, i + skip_len, skip)) + return i + skip_len; + } + return bgn; + } public static int Find_bwd_while(byte[] src, int cur, int end, byte while_byte) { --cur; while (true) { diff --git a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java b/100_core/src/gplx/Bry_fmt.java similarity index 69% rename from 100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java rename to 100_core/src/gplx/Bry_fmt.java index 1c8aa362d..2840ce9a5 100644 --- a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java +++ b/100_core/src/gplx/Bry_fmt.java @@ -15,32 +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.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +package gplx; +import gplx.core.brys.*; import gplx.core.brys.fmts.*; public class Bry_fmt { private byte[] src; private Bry_fmt_itm[] itms; private int itms_len; private Bfr_fmt_arg[] args = Bfr_fmt_arg.Ary_empty; private byte[][] keys = Bry_.Ary_empty; + private Object[] vals = null; private boolean dirty; public Bry_fmt(byte[] src, byte[][] keys, Bfr_fmt_arg[] args) { dirty = true; this.src = src; this.keys = keys; this.args = args; } + public byte[] Fmt() {return src;} public Bry_fmt Fmt_(String v) {dirty = true; src = Bry_.new_u8(v); return this;} public Bry_fmt Args_(Bfr_fmt_arg... v) {dirty = true; args = v; return this;} + public Bry_fmt Keys_(String... v) {return Keys_(Bry_.Ary(v));} public Bry_fmt Keys_(byte[]... v) {dirty = true; keys = v; return this;} - public String Bld_many_to_str_auto_bfr(Object... vals) { + public Bry_fmt Vals_(Object... v) {vals = v; return this;} + public String Bld_many_to_str_auto_bfr(Object... vals_ary) { Bry_bfr bfr = Bry_bfr_.Get(); - try {return Bld_many_to_str(bfr, vals);} + try {return Bld_many_to_str(bfr, vals_ary);} finally {bfr.Mkr_rls();} } - public String Bld_many_to_str(Bry_bfr bfr, Object... vals) { - Bld_many(bfr, vals); + public String Bld_many_to_str(Bry_bfr bfr, Object... vals_ary) { + Bld_many(bfr, vals_ary); return bfr.To_str_and_clear(); } - public void Bld_many(Bry_bfr bfr, Object... vals) { + public void Bld_many(Bry_bfr bfr, Object... vals_ary) { if (dirty) Compile(); - int vals_len = vals.length; + int vals_len = vals_ary.length; for (int i = 0; i < itms_len; ++i) { Bry_fmt_itm itm = itms[i]; switch (itm.Tid) { @@ -49,7 +54,7 @@ public class Bry_fmt { case Bry_fmt_itm.Tid__key: int idx = itm.Key_idx; if (idx > -1 && idx < vals_len) - bfr.Add_obj(vals[idx]); + bfr.Add_obj(vals_ary[idx]); else bfr.Add_mid(src, itm.Src_bgn, itm.Src_end); break; @@ -57,6 +62,7 @@ public class Bry_fmt { } } } + public String To_str() {return Bld_many_to_str_auto_bfr(vals);} private void Compile() { dirty = false; this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src); @@ -64,18 +70,10 @@ public class Bry_fmt { } public static Bry_fmt New(String fmt, String... keys) {return new Bry_fmt(Bry_.new_u8(fmt), Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} public static Bry_fmt New(byte[] fmt, String... keys) {return new Bry_fmt(fmt , Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} -} -class Bry_fmt_itm { - public Bry_fmt_itm(int tid, int src_bgn, int src_end) { - this.Tid = tid; - this.Src_bgn = src_bgn; - this.Src_end = src_end; + public static String Make_str(String fmt_str, Object... vals) {return Auto(fmt_str).Vals_(vals).To_str();} + public static Bry_fmt Auto(String fmt_str) { + byte[] fmt_bry = Bry_.new_u8(fmt_str); + byte[][] keys_bry = Bry_fmt_parser_.Parse_keys(fmt_bry); + return new Bry_fmt(fmt_bry, keys_bry, Bfr_fmt_arg.Ary_empty); } - public int Tid; - public int Src_bgn; - public int Src_end; - public int Key_idx; - public Bfr_arg Arg; - - public static final int Tid__txt = 0, Tid__key = 1, Tid__arg = 2; } diff --git a/100_core/src/gplx/Byte_ascii.java b/100_core/src/gplx/Byte_ascii.java index 2678ef7aa..f7e7356b5 100644 --- a/100_core/src/gplx/Byte_ascii.java +++ b/100_core/src/gplx/Byte_ascii.java @@ -120,7 +120,7 @@ public class Byte_ascii { , Pipe_bry = new byte[] {Byte_ascii.Pipe} , Underline_bry = new byte[] {Byte_ascii.Underline} , Slash_bry = new byte[] {Byte_ascii.Slash} - , Asterisk_bry = new byte[] {Byte_ascii.Star} + , Star_bry = new byte[] {Byte_ascii.Star} , Dash_bry = new byte[] {Byte_ascii.Dash} , Cr_lf_bry = new byte[] {Byte_ascii.Cr, Byte_ascii.Nl} ; diff --git a/100_core/src/gplx/Cancelable.java b/100_core/src/gplx/Cancelable.java index 6d32f5e09..fe3415a68 100644 --- a/100_core/src/gplx/Cancelable.java +++ b/100_core/src/gplx/Cancelable.java @@ -19,5 +19,4 @@ package gplx; public interface Cancelable { boolean Canceled(); void Cancel(); - void Cancel_reset(); } diff --git a/100_core/src/gplx/Cancelable_.java b/100_core/src/gplx/Cancelable_.java index 558a56e6e..0e838042f 100644 --- a/100_core/src/gplx/Cancelable_.java +++ b/100_core/src/gplx/Cancelable_.java @@ -23,11 +23,9 @@ public class Cancelable_ { class Cancelable_never implements Cancelable { public boolean Canceled() {return false;} public void Cancel() {} - public void Cancel_reset() {} } class Cancelable_proxy implements Cancelable { private boolean canceled = false; public boolean Canceled() {return canceled;} public void Cancel() {canceled = true;} - public void Cancel_reset() {canceled = false;} } diff --git a/100_core/src/gplx/Decimal_adp.java b/100_core/src/gplx/Decimal_adp.java index da8de7853..02698eff4 100644 --- a/100_core/src/gplx/Decimal_adp.java +++ b/100_core/src/gplx/Decimal_adp.java @@ -39,7 +39,9 @@ public class Decimal_adp implements CompareAble { 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);} + 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();} diff --git a/100_core/src/gplx/Decimal_adp__tst.java b/100_core/src/gplx/Decimal_adp__tst.java index de4f44d52..04f26383f 100644 --- a/100_core/src/gplx/Decimal_adp__tst.java +++ b/100_core/src/gplx/Decimal_adp__tst.java @@ -59,6 +59,7 @@ public class Decimal_adp__tst { 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"); + fxt.Test_to_str_fmt(1, 2, "00.00", "00.50"); } @Test public void Round() { fxt.Test_round("123.456", 3, "123.456"); diff --git a/100_core/src/gplx/GfoEvMgr_.java b/100_core/src/gplx/GfoEvMgr_.java index 512584222..9b2681643 100644 --- a/100_core/src/gplx/GfoEvMgr_.java +++ b/100_core/src/gplx/GfoEvMgr_.java @@ -27,17 +27,17 @@ public class GfoEvMgr_ { } } public static void Pub(GfoEvMgrOwner pub, String pubEvt) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, GfoMsg_.new_cast_(pubEvt));} - public static void PubObj(GfoEvMgrOwner pub, String pubEvt, String key, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, KeyVal_.new_(key, v)));} - public static void PubVal(GfoEvMgrOwner pub, String pubEvt, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, KeyVal_.new_("v", v)));} - public static void PubVals(GfoEvMgrOwner pub, String pubEvt, KeyVal... ary) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, ary));} + public static void PubObj(GfoEvMgrOwner pub, String pubEvt, String key, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, Keyval_.new_(key, v)));} + public static void PubVal(GfoEvMgrOwner pub, String pubEvt, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, Keyval_.new_("v", v)));} + public static void PubVals(GfoEvMgrOwner pub, String pubEvt, Keyval... ary) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, ary));} public static void PubMsg(GfoEvMgrOwner pub, GfsCtx ctx, String pubEvt, GfoMsg m) {pub.EvMgr().Pub(ctx, pubEvt, m);} public static void Lnk(GfoEvMgrOwner pub, GfoEvMgrOwner sub) {sub.EvMgr().Lnk(pub);} public static void RlsPub(GfoEvMgrOwner pub) {pub.EvMgr().RlsPub(pub);} public static void RlsSub(GfoEvMgrOwner sub) {sub.EvMgr().RlsSub(sub);} - static GfoMsg msg_(String evt, KeyVal... kvAry) { + static GfoMsg msg_(String evt, Keyval... kvAry) { GfoMsg m = GfoMsg_.new_cast_(evt); for (int i = 0; i < kvAry.length; i++) { - KeyVal kv = kvAry[i]; + Keyval kv = kvAry[i]; m.Add(kv.Key(), kv.Val()); } return m; diff --git a/100_core/src/gplx/GfoInvkXtoStr.java b/100_core/src/gplx/GfoInvkXtoStr.java index 5926d0fc8..76388c3db 100644 --- a/100_core/src/gplx/GfoInvkXtoStr.java +++ b/100_core/src/gplx/GfoInvkXtoStr.java @@ -34,7 +34,7 @@ public class GfoInvkXtoStr { invk.Invk(ctx, 0, k, m); GfoMsg rv = GfoMsg_.new_cast_(k); for (int i = 0; i < m.Args_count(); i++) { - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); rv.Add(kv.Key(), ary[i]); } GfoMsg root = GfoMsg_.new_cast_(invkKey); diff --git a/100_core/src/gplx/GfoMsg.java b/100_core/src/gplx/GfoMsg.java index 164f20f6e..49a6b9365 100644 --- a/100_core/src/gplx/GfoMsg.java +++ b/100_core/src/gplx/GfoMsg.java @@ -25,7 +25,7 @@ public interface GfoMsg { GfoMsg Parse_(boolean v); int Args_count(); - KeyVal Args_getAt(int i); + Keyval Args_getAt(int i); GfoMsg Args_ovr(String k, Object v); void Args_reset(); GfoMsg Add(String k, Object v); diff --git a/100_core/src/gplx/GfoMsg_.java b/100_core/src/gplx/GfoMsg_.java index 1ce5a9bc3..03f3825bd 100644 --- a/100_core/src/gplx/GfoMsg_.java +++ b/100_core/src/gplx/GfoMsg_.java @@ -28,7 +28,7 @@ public class GfoMsg_ { return rv; } public static GfoMsg root_(String... ary) {return root_leafArgs_(ary);} - public static GfoMsg root_leafArgs_(String[] ary, KeyVal... kvAry) { + public static GfoMsg root_leafArgs_(String[] ary, Keyval... kvAry) { int len = Array_.Len(ary); if (len == 0) throw Err_.new_invalid_arg("== 0", "@len", len); GfoMsg root = new GfoMsg_base().ctor_(ary[0], false); GfoMsg owner = root; @@ -39,7 +39,7 @@ public class GfoMsg_ { owner = cur; } for (int i = 0; i < kvAry.length; i++) { - KeyVal kv = kvAry[i]; + Keyval kv = kvAry[i]; owner.Add(kv.Key(), kv.Val()); } return root; @@ -78,14 +78,14 @@ public class GfoMsg_ { class GfoMsg_wtr extends GfoMsg_base { @Override protected Object ReadOr(String k, Object defaultOr) { if (args == null) args = List_adp_.new_(); - args.Add(KeyVal_.new_(k, null)); + args.Add(Keyval_.new_(k, null)); return defaultOr; } } class GfoMsg_rdr extends GfoMsg_base { @Override protected Object ReadOr(String k, Object defaultOr) { if (args == null) args = List_adp_.new_(); - args.Add(KeyVal_.new_(k, defaultOr)); + args.Add(Keyval_.new_(k, defaultOr)); return defaultOr; } } @@ -113,23 +113,23 @@ class GfoMsg_base implements GfoMsg { sub.Args_reset(); } } - public KeyVal Args_getAt(int i) {return args == null ? null : (KeyVal)args.Get_at(i);} + public Keyval Args_getAt(int i) {return args == null ? null : (Keyval)args.Get_at(i);} public GfoMsg Args_ovr(String k, Object v) { if (args == null) args = List_adp_.new_(); for (int i = 0; i < args.Count(); i++) { - KeyVal kv = (KeyVal)args.Get_at(i); + Keyval kv = (Keyval)args.Get_at(i); if (String_.Eq(k, kv.Key())) { kv.Val_(v); return this; } } - args.Add(KeyVal_.new_(k, v)); + args.Add(Keyval_.new_(k, v)); return this; } public GfoMsg Parse_(boolean v) {parse = v; return this;} public GfoMsg Add(String k, Object v) { if (args == null) args = List_adp_.new_(); - args.Add(KeyVal_.new_(k, v)); + args.Add(Keyval_.new_(k, v)); return this; } public boolean ReadBool(String k) {Object rv = ReadOr(k,false); if (rv == Nil) ThrowNotFound(k); return parse ? Yn.parse_or((String)rv, false) : Bool_.cast(rv);} @@ -177,13 +177,13 @@ class GfoMsg_base implements GfoMsg { if (args == null) return Nil; // WORKAROUND.gfui: args null for DataBndr_whenEvt_execCmd if (!String_.Eq(k, "")) { for (int i = 0; i < args.Count(); i++) { - KeyVal kv = (KeyVal)args.Get_at(i); + Keyval kv = (Keyval)args.Get_at(i); if (String_.Eq(k, kv.Key())) return kv.Val(); } } if (counter >= args.Count()) return Nil; for (int i = 0; i < args.Count(); i++) { - KeyVal kv = (KeyVal)args.Get_at(i); + Keyval kv = (Keyval)args.Get_at(i); if (String_.Eq(kv.Key(), "") && i >= counter) { counter++; return kv.Val(); @@ -196,7 +196,7 @@ class GfoMsg_base implements GfoMsg { if (this.Args_count() == 0) return "<>"; String_bldr sb = String_bldr_.new_(); for (int i = 0; i < this.Args_count(); i++) { - KeyVal rv = (KeyVal)this.Args_getAt(i); + Keyval rv = (Keyval)this.Args_getAt(i); sb.Add_fmt("{0};", rv.Key()); } return sb.To_str(); @@ -231,7 +231,7 @@ class GfoMsg_base implements GfoMsg { sb.Add(":"); boolean first = true; for (int i = 0; i < m.Args_count(); i++) { - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); if (kv.Val() == null) continue; if (!first) sb.Add(" "); sb.Add(kv.Key()); diff --git a/100_core/src/gplx/GfoMsg_tst.java b/100_core/src/gplx/GfoMsg_tst.java index cd09af2ce..4b77413e9 100644 --- a/100_core/src/gplx/GfoMsg_tst.java +++ b/100_core/src/gplx/GfoMsg_tst.java @@ -22,7 +22,7 @@ public class GfoMsg_tst { GfsCore.Instance.AddObj(new Mok(), "Mok"); } @Test public void Write1() { - GfoMsg m = GfoMsg_.root_leafArgs_(String_.Ary("a", "b"), KeyVal_.new_("int0", 1)); + GfoMsg m = GfoMsg_.root_leafArgs_(String_.Ary("a", "b"), Keyval_.new_("int0", 1)); tst_Msg(m, "a.b:int0='1';"); } @Test public void Write() { diff --git a/100_core/src/gplx/Gfo_usr_dlg_.java b/100_core/src/gplx/Gfo_usr_dlg_.java index 4d3806701..08a0b2fb1 100644 --- a/100_core/src/gplx/Gfo_usr_dlg_.java +++ b/100_core/src/gplx/Gfo_usr_dlg_.java @@ -53,7 +53,7 @@ public class Gfo_usr_dlg_ { } class Gfo_usr_dlg_noop implements Gfo_usr_dlg { public boolean Canceled() {return false;} public void Canceled_y_() {} public void Canceled_n_() {} - public void Cancel() {} public void Cancel_reset() {} + public void Cancel() {} public void Clear() {} public Gfo_usr_dlg__log Log_wkr() {return Gfo_usr_dlg__log_.Noop;} public void Log_wkr_(Gfo_usr_dlg__log v) {} public Gfo_usr_dlg__gui Gui_wkr() {return Gfo_usr_dlg__gui_.Noop;} public void Gui_wkr_(Gfo_usr_dlg__gui v) {} diff --git a/100_core/src/gplx/Gfo_usr_dlg__gui_.java b/100_core/src/gplx/Gfo_usr_dlg__gui_.java index 175ff1448..a77cdbe6b 100644 --- a/100_core/src/gplx/Gfo_usr_dlg__gui_.java +++ b/100_core/src/gplx/Gfo_usr_dlg__gui_.java @@ -21,6 +21,8 @@ public class Gfo_usr_dlg__gui_ { public static final Gfo_usr_dlg__gui Noop = new Gfo_usr_dlg__gui_noop(); public static final Gfo_usr_dlg__gui Console = new Gfo_usr_dlg__gui_console(); public static final Gfo_usr_dlg__gui Test = new Gfo_usr_dlg__gui_test(); + public static final Gfo_usr_dlg__gui Mem = new Gfo_usr_dlg__gui_mem_string(); + public static String Mem_file() {return ((Gfo_usr_dlg__gui_mem_string)Mem).file;} } class Gfo_usr_dlg__gui_noop implements Gfo_usr_dlg__gui { public void Clear() {} @@ -39,3 +41,12 @@ class Gfo_usr_dlg__gui_console implements Gfo_usr_dlg__gui { public void Write_warn(String text) {console.Write_str_w_nl(text);} public void Write_stop(String text) {console.Write_str_w_nl(text);} } +class Gfo_usr_dlg__gui_mem_string implements Gfo_usr_dlg__gui { + public String file = ""; + public void Clear() {file = "";} + public String_ring Prog_msgs() {return ring;} private final String_ring ring = new String_ring().Max_(0); + public void Write_prog(String text) {file += text + "\n";} + public void Write_note(String text) {file += text + "\n";} + public void Write_warn(String text) {file += text + "\n";} + public void Write_stop(String text) {file += text + "\n";} +} diff --git a/100_core/src/gplx/Gfo_usr_dlg_base.java b/100_core/src/gplx/Gfo_usr_dlg_base.java index 4d1071ba2..41d733be7 100644 --- a/100_core/src/gplx/Gfo_usr_dlg_base.java +++ b/100_core/src/gplx/Gfo_usr_dlg_base.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx; import gplx.core.brys.fmtrs.*; public class Gfo_usr_dlg_base implements Gfo_usr_dlg { - private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); - private final Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_().Fail_when_invalid_escapes_(false); // do not fail b/c msgs may contain excerpt of random text; EX:[[User:A|~A~]] DATE:2014-11-28 + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + private final Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_().Fail_when_invalid_escapes_(false); // do not fail b/c msgs may contain excerpt of random text; EX:[[User:A|~A~]] DATE:2014-11-28 public Gfo_usr_dlg_base(Gfo_usr_dlg__log log_wkr, Gfo_usr_dlg__gui gui_wkr) {this.log_wkr = log_wkr; this.gui_wkr = gui_wkr;} public Gfo_usr_dlg__log Log_wkr() {return log_wkr;} public void Log_wkr_(Gfo_usr_dlg__log v) {log_wkr = v;} private Gfo_usr_dlg__log log_wkr; public Gfo_usr_dlg__gui Gui_wkr() {return gui_wkr;} public void Gui_wkr_(Gfo_usr_dlg__gui v) {gui_wkr = v;} private Gfo_usr_dlg__gui gui_wkr; public boolean Canceled() {return canceled;} public void Canceled_y_() {canceled = true;} public void Canceled_n_() {canceled = false;} private boolean canceled; - public void Cancel() {canceled = true;} public void Cancel_reset() {canceled = false;} + public void Cancel() {canceled = true;} public String Log_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); log_wkr.Log_to_session(rv); return rv;} public String Warn_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); log_wkr.Log_to_err(rv); gui_wkr.Write_warn(rv); return rv;} public String Prog_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); gui_wkr.Write_prog(rv); return rv;} @@ -45,12 +45,16 @@ public class Gfo_usr_dlg_base implements Gfo_usr_dlg { return rv; } private String Bld_msg_many(String grp_key, String msg_key, String fmt, Object[] args) { - tmp_fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, args); - return tmp_bfr.To_str_and_clear(); + synchronized (tmp_fmtr) { + tmp_fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, args); + return tmp_bfr.To_str_and_clear(); + } } private String Bld_msg_one(String grp_key, String msg_key, String fmt, Object val) { - tmp_fmtr.Fmt_(fmt).Bld_bfr_one(tmp_bfr, val); - return tmp_bfr.To_str_and_clear(); + synchronized (tmp_fmtr) { + tmp_fmtr.Fmt_(fmt).Bld_bfr_one(tmp_bfr, val); + return tmp_bfr.To_str_and_clear(); + } } private String Bld_msg_none(String grp_key, String msg_key, String fmt) {return fmt;} } diff --git a/100_core/src/gplx/Hash_adp_bry.java b/100_core/src/gplx/Hash_adp_bry.java index 201c2af6d..db5108d5f 100644 --- a/100_core/src/gplx/Hash_adp_bry.java +++ b/100_core/src/gplx/Hash_adp_bry.java @@ -37,6 +37,7 @@ public class Hash_adp_bry extends gplx.core.lists.Hash_adp_base implements Hash_ Object o = Get_by_mid(key, bgn, end); return (o == null) ? or : ((Int_obj_val)o).Val(); } + public byte Get_as_byte_or(byte[] key, byte or) {return Get_as_byte_or(key, 0, key.length, or);} public byte Get_as_byte_or(byte[] key, int bgn, int end, byte or) { Object o = Get_by_mid(key, bgn, end); return o == null ? or : ((Byte_obj_val)o).Val(); diff --git a/100_core/src/gplx/Int_.java b/100_core/src/gplx/Int_.java index 240fbac5a..8c3020f21 100644 --- a/100_core/src/gplx/Int_.java +++ b/100_core/src/gplx/Int_.java @@ -178,6 +178,7 @@ public class Int_ implements GfoInvkAble { } return rv; } + public static int Subtract_long(long lhs, long rhs) {return (int)(lhs - rhs);} public static int To_int_hex(byte b) { 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: @@ -252,9 +253,10 @@ public class Int_ implements GfoInvkAble { } public static byte[] To_bry(int v) {return Bry_.new_a7(To_str(v));} public static final int - Min_value = Integer.MIN_VALUE - , Max_value = Integer.MAX_VALUE - , Neg1 = -1 - , Neg1_count = -1 + Min_value = Integer.MIN_VALUE + , Max_value = Integer.MAX_VALUE + , Max_value__31 = 2147483647 + , Neg1 = -1 + , Neg1_count = -1 ; } diff --git a/100_core/src/gplx/KeyVal.java b/100_core/src/gplx/KeyVal.java index db8b45e67..d53c7d0d8 100644 --- a/100_core/src/gplx/KeyVal.java +++ b/100_core/src/gplx/KeyVal.java @@ -16,17 +16,17 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class KeyVal implements To_str_able { - @gplx.Internal protected KeyVal(int key_tid, Object key, Object val) {this.key_tid = key_tid; this.key = key; this.val = val;} - public String Key() {return Object_.Xto_str_strict_or_null(key);} - public int Key_tid() {return key_tid;} private int key_tid; - public Object Key_as_obj() {return key;} private Object key; - public Object Val() {return val;} private Object val; - public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);} - public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);} - public byte[] Val_to_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_null(val));} - public KeyVal Key_(Object v) {this.key = v; return this;} - public KeyVal Val_(Object v) {this.val = v; return this;} +public class Keyval implements To_str_able { + @gplx.Internal protected Keyval(int key_tid, Object key, Object val) {this.key_tid = key_tid; this.key = key; this.val = val;} + public String Key() {return Object_.Xto_str_strict_or_null(key);} + public Object Key_as_obj() {return key;} private Object key; + public int Key_tid() {return key_tid;} private int key_tid; + public Object Val() {return val;} private Object val; + public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);} + public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);} + public byte[] Val_to_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_null(val));} + public Keyval Key_(Object v) {this.key = v; return this;} + public Keyval Val_(Object v) {this.val = v; return this;} + public String To_str() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);} @Override public String toString() {return To_str();} - public String To_str() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);} } diff --git a/100_core/src/gplx/KeyValHash.java b/100_core/src/gplx/KeyValHash.java deleted file mode 100644 index 4fb6bd9fc..000000000 --- a/100_core/src/gplx/KeyValHash.java +++ /dev/null @@ -1,60 +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; -public class KeyValHash { - private Ordered_hash hash = Ordered_hash_.New(); - public int Count() {return hash.Count();} - public KeyValHash Clear() {hash.Clear(); return this;} - public boolean Has(String key) {return hash.Has(key);} - public KeyVal Get_at(int i) {return (KeyVal)hash.Get_at(i);} - public Object FetchValOr(String key, Object or) {KeyVal rv = FetchOrNull(key); return rv == null ? or : rv.Val();} - public Object FetchValOrNull(String key) {return FetchValOr(key, null);} - public Object FetchValOrFail(String key) {return KeyVal_.as_(hash.Get_by_or_fail(key)).Val();} - public KeyValHash Add(KeyVal kv) {hash.Add(kv.Key(), kv); return this;} - public KeyValHash Add(String key, Object val) {hash.Add(key, KeyVal_.new_(key, val)); return this;} - public KeyValHash Add_if_dupe_use_nth(String key, Object val) {hash.Add_if_dupe_use_nth(key, KeyVal_.new_(key, val)); return this;} - public void Del(String key) {hash.Del(key);} - public KeyVal[] Xto_bry() { - KeyVal[] rv = new KeyVal[this.Count()]; - for (int i = 0; i < rv.length; i++) - rv[i] = this.Get_at(i); - return rv; - } - public static KeyValHash new_() {return new KeyValHash();} protected KeyValHash() {} - public static KeyValHash new_by_ary(KeyVal[] ary) { - int ary_len = ary.length; - KeyValHash rv = new KeyValHash(); - for (int i = 0; i < ary_len; i++) - rv.Add(ary[i]); - return rv; - } - public KeyVal FetchOrNull(String key) {return KeyVal_.as_(hash.Get_by(key));} - public static KeyValHash strAry_(String[] ary) {// needed for consoleLine - int aryLen = Array_.Len(ary); if (aryLen % 2 != 0) throw Err_.new_wo_type("array length must be divisible by 2", "aryLen", aryLen, "ary", String_.Concat_lines_crlf(ary)); - KeyValHash rv = new KeyValHash(); - String key = null; - for (int i = 0; i < aryLen; i++) { - if (i % 2 == 0) - key = ary[i]; - else - rv.Add(key, ary[i]); - } - return rv; - } - public static final KeyValHash Empty = new KeyValHash(); -} \ No newline at end of file diff --git a/100_core/src/gplx/KeyValList.java b/100_core/src/gplx/KeyValList.java deleted file mode 100644 index 2e7cb1e50..000000000 --- a/100_core/src/gplx/KeyValList.java +++ /dev/null @@ -1,36 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx; -import gplx.core.strings.*; -public class KeyValList {//20101217 - public int Count() {return list.Count();} List_adp list = List_adp_.new_(); - public void Clear() {list.Clear();} - public KeyVal GetAt(int i) {return (KeyVal)list.Get_at(i);} - public KeyValList Add(String key, Object val) {list.Add(KeyVal_.new_(key, val)); return this;} - public KeyVal[] Xto_bry() {return (KeyVal[])list.To_ary(KeyVal.class);} - public String To_str() { - String_bldr sb = String_bldr_.new_(); - for (int i = 0; i < list.Count(); i++) { - KeyVal kv = (KeyVal)list.Get_at(i); - sb.Add_spr_unless_first(kv.Key(), " ", i); - sb.Add("=").Add(kv.Val_to_str_or_empty()); - } - return sb.To_str(); - } - public static KeyValList args_(String key, Object val) {return new KeyValList().Add(key, val);} -} diff --git a/100_core/src/gplx/KeyVal_.java b/100_core/src/gplx/KeyVal_.java index e109c0390..bd0e0a7cb 100644 --- a/100_core/src/gplx/KeyVal_.java +++ b/100_core/src/gplx/KeyVal_.java @@ -17,17 +17,17 @@ along with this program. If not, see . */ package gplx; import gplx.core.strings.*; -public class KeyVal_ { - public static final KeyVal[] Ary_empty = new KeyVal[0]; - public static KeyVal[] Ary(KeyVal... ary) {return ary;} - public static KeyVal[] Ary_cast_(Object o) { - try {return (KeyVal[])o;} - catch (Exception e) {throw Err_.new_cast(e, KeyVal.class, o);} +public class Keyval_ { + public static final Keyval[] Ary_empty = new Keyval[0]; + public static Keyval[] Ary(Keyval... ary) {return ary;} + public static Keyval[] Ary_cast_(Object o) { + try {return (Keyval[])o;} + catch (Exception e) {throw Err_.new_cast(e, Keyval.class, o);} } - public static KeyVal[] Ary_insert(KeyVal[] orig, boolean insert_at_end, KeyVal... vals) { + public static Keyval[] Ary_insert(Keyval[] orig, boolean insert_at_end, Keyval... vals) { int orig_len = orig.length, vals_len = vals.length; int rv_len = orig_len + vals_len; - KeyVal[] rv = new KeyVal[rv_len]; + Keyval[] rv = new Keyval[rv_len]; int vals_bgn = 0 , vals_end = vals_len; int orig_bgn = vals_len , orig_end = rv_len; if (insert_at_end) { @@ -40,38 +40,38 @@ public class KeyVal_ { rv[i] = vals[i - vals_bgn]; return rv; } - public static String Ary_to_str(KeyVal... ary) { + public static String Ary_to_str(Keyval... ary) { String_bldr sb = String_bldr_.new_(); int len = ary.length; for (int i = 0; i < len; i++) { - KeyVal itm = ary[i]; + Keyval itm = ary[i]; sb.Add(itm.Key()).Add("="); Object itm_val = itm.Val(); - if (Type_adp_.Eq_typeSafe(itm_val, KeyVal[].class)) - sb.Add(Ary_to_str((KeyVal[])itm_val)); + if (Type_adp_.Eq_typeSafe(itm_val, Keyval[].class)) + sb.Add(Ary_to_str((Keyval[])itm_val)); else sb.Add(Object_.Xto_str_strict_or_null_mark(itm_val)); sb.Add_char_nl(); } return sb.To_str(); } - public static Object Ary_get_by_key_or_null(KeyVal[] ary, String key) { + public static Object Ary_get_by_key_or_null(Keyval[] ary, String key) { int len = ary.length; for (int i = 0; i < len; i++) { - KeyVal kv = ary[i]; + Keyval kv = ary[i]; if (String_.Eq(kv.Key(), key)) return kv.Val(); } return null; } - public static String Ary__to_str__nest(KeyVal... ary) { + public static String Ary__to_str__nest(Keyval... ary) { Bry_bfr bfr = Bry_bfr.new_(); Ary__to_str__nest(bfr, 0, ary); return bfr.To_str_and_clear(); } - private static void Ary__to_str__nest(Bry_bfr bfr, int indent, KeyVal[] ary) { + private static void Ary__to_str__nest(Bry_bfr bfr, int indent, Keyval[] ary) { int len = ary.length; for (int i = 0; i < len; ++i) { - KeyVal itm = ary[i]; + Keyval itm = ary[i]; if (indent > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent * 2); // add indent : " " bfr.Add_str_u8(Object_.Xto_str_strict_or_empty(itm.Key())).Add_byte_eq();// add key + eq : "key=" @@ -80,9 +80,9 @@ public class KeyVal_ { bfr.Add_str_a7(String_.Null_mark); else { Class val_type = Type_adp_.ClassOf_obj(val); - if (Type_adp_.Eq(val_type, KeyVal[].class)) { // val is KeyVal[]; recurse + if (Type_adp_.Eq(val_type, Keyval[].class)) { // val is Keyval[]; recurse bfr.Add_byte_nl(); // add nl : "\n" - Ary__to_str__nest(bfr, indent + 1, (KeyVal[])val); + Ary__to_str__nest(bfr, indent + 1, (Keyval[])val); continue; // don't add \n below } else if (Type_adp_.Eq(val_type, Bool_.Cls_ref_type)) { // val is boolean @@ -95,9 +95,9 @@ public class KeyVal_ { bfr.Add_byte_nl(); } } - public static KeyVal as_(Object obj) {return obj instanceof KeyVal ? (KeyVal)obj : null;} - public static KeyVal new_(String key) {return new KeyVal(Type_adp_.Tid__str, key, key);} - public static KeyVal new_(String key, Object val) {return new KeyVal(Type_adp_.Tid__str, key, val);} - public static KeyVal int_(int key, Object val) {return new KeyVal(Type_adp_.Tid__int, key, val);} - public static KeyVal obj_(Object key, Object val) {return new KeyVal(Type_adp_.Tid__obj, key, val);} + public static Keyval as_(Object obj) {return obj instanceof Keyval ? (Keyval)obj : null;} + public static Keyval new_(String key) {return new Keyval(Type_adp_.Tid__str, key, key);} + public static Keyval new_(String key, Object val) {return new Keyval(Type_adp_.Tid__str, key, val);} + public static Keyval int_(int key, Object val) {return new Keyval(Type_adp_.Tid__int, key, val);} + public static Keyval obj_(Object key, Object val) {return new Keyval(Type_adp_.Tid__obj, key, val);} } diff --git a/100_core/src/gplx/Keyval_hash.java b/100_core/src/gplx/Keyval_hash.java new file mode 100644 index 000000000..275d4c831 --- /dev/null +++ b/100_core/src/gplx/Keyval_hash.java @@ -0,0 +1,41 @@ +/* +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; +public class Keyval_hash { + private final Ordered_hash hash = Ordered_hash_.New(); + public int Count() {return hash.Count();} + public Keyval_hash Clear() {hash.Clear(); return this;} + public boolean Has(String key) {return hash.Has(key);} + public Keyval Get_at(int i) {return (Keyval)hash.Get_at(i);} + public Object Get_val_or(String key, Object or) {Keyval rv = Get_kvp_or_null(key); return rv == null ? or : rv.Val();} + public Object Get_val_or_null(String key) {return Get_val_or(key, null);} + public Object Get_val_or_fail(String key) {return Keyval_.as_(hash.Get_by_or_fail(key)).Val();} + public String Get_val_as_str_or_fail(String key) {return (String)Get_val_or_fail(key);} + public Keyval Get_kvp_or_null(String key) {return Keyval_.as_(hash.Get_by(key));} + public Keyval_hash Add(Keyval kv) {hash.Add(kv.Key(), kv); return this;} + public Keyval_hash Add(String key, Object val) {hash.Add(key, Keyval_.new_(key, val)); return this;} + public Keyval_hash Add_if_dupe_use_nth(String key, Object val) {hash.Add_if_dupe_use_nth(key, Keyval_.new_(key, val)); return this;} + public void Del(String key) {hash.Del(key);} + public Keyval[] To_ary() { + int len = this.Count(); + Keyval[] rv = new Keyval[len]; + for (int i = 0; i < len; ++i) + rv[i] = this.Get_at(i); + return rv; + } +} \ No newline at end of file diff --git a/100_core/src/gplx/Keyval_list.java b/100_core/src/gplx/Keyval_list.java new file mode 100644 index 000000000..d571fa7a2 --- /dev/null +++ b/100_core/src/gplx/Keyval_list.java @@ -0,0 +1,36 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx; +public class Keyval_list { + public int Count() {return list.Count();} private final List_adp list = List_adp_.new_(); + public void Clear() {list.Clear();} + public Keyval Get_at(int i) {return (Keyval)list.Get_at(i);} + public Keyval_list Add(String key, Object val) {list.Add(Keyval_.new_(key, val)); return this;} + public Keyval[] To_ary() {return (Keyval[])list.To_ary(Keyval.class);} + public String To_str() { + Bry_bfr bfr = Bry_bfr.new_(); + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Keyval kv = (Keyval)list.Get_at(i); + if (i == 0) bfr.Add_byte_space(); + bfr.Add_str_u8(kv.Key()).Add_byte_eq().Add_str_u8(kv.Val_to_str_or_empty()); + } + return bfr.To_str_and_clear(); + } + public static Keyval_list New_with_one(String key, Object val) {return new Keyval_list().Add(key, val);} +} diff --git a/100_core/src/gplx/List_adp.java b/100_core/src/gplx/List_adp.java index a822d003a..0a9f0e73f 100644 --- a/100_core/src/gplx/List_adp.java +++ b/100_core/src/gplx/List_adp.java @@ -17,9 +17,8 @@ along with this program. If not, see . */ package gplx; import gplx.core.lists.*; /*EnumerAble,ComparerAble*/ -public interface List_adp extends EnumerAble { +public interface List_adp extends EnumerAble, List_adp__getable { int Count(); - Object Get_at(int i); Object Get_at_last(); void Add(Object o); void Add_at(int i, Object o); @@ -49,6 +48,7 @@ class List_adp_obj extends List_adp_base implements List_adp { } class List_adp_noop implements List_adp { public int Count() {return 0;} + public int Len() {return 0;} public Object Get_at(int i) {return null;} public Object Get_at_last() {return null;} public Object PopLast() {return null;} diff --git a/100_core/src/gplx/List_adp_base.java b/100_core/src/gplx/List_adp_base.java index 5a5f5078b..b9b92a730 100644 --- a/100_core/src/gplx/List_adp_base.java +++ b/100_core/src/gplx/List_adp_base.java @@ -29,6 +29,7 @@ public abstract class List_adp_base implements List_adp, GfoInvkAble { return new Iterator_objAry(list, count); } public void Add_many(Object... ary) {for (Object o : ary) Add_base(o);} + public int Len() {return count;} public int Count() {return count;} public int Idx_last() {return count - 1;} protected Object Get_at_base(int index) {if (index >= count || index < 0) throw Err_.new_missing_idx(index, count); diff --git a/100_core/src/gplx/Math_.java b/100_core/src/gplx/Math_.java index e5f0bd779..b970760d0 100644 --- a/100_core/src/gplx/Math_.java +++ b/100_core/src/gplx/Math_.java @@ -17,12 +17,13 @@ along with this program. If not, see . */ package gplx; public class Math_ { - public static double Pow(double val, double exponent) {return java.lang.Math.pow(val, exponent);} - public static double Pi = java.lang.Math.PI; - public static double E = java.lang.Math.E; - public static double Ceil(double v) {return java.lang.Math.ceil(v);} - public static double Floor(double v) {return java.lang.Math.floor(v);} - public static double Round(double v, int places) { + public static double Pow(double val, double exponent) {return java.lang.Math.pow(val, exponent);} + public static double Pi = java.lang.Math.PI; + public static double E = java.lang.Math.E; + public static int Ceil_as_int(double v) {return (int)Ceil(v);} + public static double Ceil(double v) {return java.lang.Math.ceil(v);} + public static double Floor(double v) {return java.lang.Math.floor(v);} + public static double Round(double v, int places) { return java.math.BigDecimal.valueOf(v).setScale(places, java.math.BigDecimal.ROUND_HALF_UP).doubleValue(); } public static int Trunc(double v) {return (int)v;} diff --git a/100_core/src/gplx/Object_.java b/100_core/src/gplx/Object_.java index f9356e721..77911ef02 100644 --- a/100_core/src/gplx/Object_.java +++ b/100_core/src/gplx/Object_.java @@ -32,6 +32,13 @@ public class Object_ { rv[i] = rhs[i - lhs_len]; return rv; } + public static String[] Ary__to_str_ary(Object[]... ary) { + int len = ary.length; + String[] rv = new String[len]; + for (int i = 0; i < len; ++i) + rv[i] = String_.Concat_with_obj("|", (Object[])ary[i]); + return rv; + } public static boolean Eq(Object lhs, Object rhs) { if (lhs == null && rhs == null) return true; else if (lhs == null || rhs == null) return false; diff --git a/100_core/src/gplx/Ordered_hash.java b/100_core/src/gplx/Ordered_hash.java index 8d7be4eea..c71b66cdb 100644 --- a/100_core/src/gplx/Ordered_hash.java +++ b/100_core/src/gplx/Ordered_hash.java @@ -17,8 +17,7 @@ along with this program. If not, see . */ package gplx; import gplx.core.lists.*; /*EnumerAble,ComparerAble*/ -public interface Ordered_hash extends Hash_adp { - Object Get_at(int i); +public interface Ordered_hash extends Hash_adp, List_adp__getable { void Add_at(int i, Object o); int Idx_of(Object item); void Sort(); diff --git a/100_core/src/gplx/Ordered_hash_base.java b/100_core/src/gplx/Ordered_hash_base.java index 7ce93a814..ad442ab30 100644 --- a/100_core/src/gplx/Ordered_hash_base.java +++ b/100_core/src/gplx/Ordered_hash_base.java @@ -19,6 +19,7 @@ package gplx; import gplx.core.strings.*; import gplx.core.envs.*; import gplx.core.lists.*; /*EnumerAble,ComparerAble*/ public class Ordered_hash_base extends Hash_adp_base implements Ordered_hash, GfoInvkAble { + private final List_adp ordered = List_adp_.new_(); @Override protected void Add_base(Object key, Object val) { super.Add_base(key, val); ordered.Add(val); @@ -88,7 +89,7 @@ public class Ordered_hash_base extends Hash_adp_base implements Ordered_hash, Gf else return GfoInvkAble_.Rv_unhandled; return this; } static final String Invk_SetKeyOnly = "SetKeyOnly", Invk_Print = "Print"; - final List_adp ordered = List_adp_.new_(); + public int Len() {return ordered.Count();} @Override public int Count() {return ordered.Count();} public Ordered_hash_base() {} } diff --git a/100_core/src/gplx/UsrMsg.java b/100_core/src/gplx/UsrMsg.java index dcd711980..9e6200e00 100644 --- a/100_core/src/gplx/UsrMsg.java +++ b/100_core/src/gplx/UsrMsg.java @@ -22,11 +22,11 @@ public class UsrMsg { public String Hdr() {return hdr;} public UsrMsg Hdr_(String val) {hdr = val; return this;} private String hdr; public Ordered_hash Args() {return args;} Ordered_hash args = Ordered_hash_.New(); public UsrMsg Add(String k, Object v) { - args.Add(k, KeyVal_.new_(k, v)); + args.Add(k, Keyval_.new_(k, v)); return this; } public UsrMsg Add_if_dupe_use_nth(String k, Object v) { - args.Add_if_dupe_use_nth(k, KeyVal_.new_(k, v)); + args.Add_if_dupe_use_nth(k, Keyval_.new_(k, v)); return this; } public String XtoStrSingleLine() {return To_str(" ");} @@ -35,7 +35,7 @@ public class UsrMsg { if (hdr == null) { GfoMsg m = GfoMsg_.new_cast_(cmd); for (int i = 0; i < args.Count(); i++) { - KeyVal kv = (KeyVal)args.Get_at(i); + Keyval kv = (Keyval)args.Get_at(i); m.Add(kv.Key(), kv.Val()); } return Object_.Xto_str_strict_or_null_mark(invk.Invk(GfsCtx.Instance, 0, cmd, m)); @@ -43,7 +43,7 @@ public class UsrMsg { String_bldr sb = String_bldr_.new_(); sb.Add(hdr).Add(spr); for (int i = 0; i < args.Count(); i++) { - KeyVal kv = (KeyVal)args.Get_at(i); + Keyval kv = (Keyval)args.Get_at(i); sb.Add_spr_unless_first("", " ", i); sb.Add_fmt("{0}={1}", kv.Key(), kv.Val(), spr); } diff --git a/100_core/src/gplx/core/brys/Bry_rdr.java b/100_core/src/gplx/core/brys/Bry_rdr.java index 306ded6e9..ac722b197 100644 --- a/100_core/src/gplx/core/brys/Bry_rdr.java +++ b/100_core/src/gplx/core/brys/Bry_rdr.java @@ -22,6 +22,7 @@ public class Bry_rdr { public byte[] Src() {return src;} protected byte[] src; public int Src_end() {return src_end;} protected int src_end; public int Pos() {return pos;} protected int pos; + public boolean Pos_is_eos() {return pos == src_end;} public Bry_rdr Dflt_dlm_(byte b) {this.dflt_dlm = b; return this;} private byte dflt_dlm; public Bry_rdr Fail_throws_err_(boolean v) {err_wkr.Fail_throws_err_(v); return this;} public Bry_rdr Init_by_src(byte[] src) {err_wkr.Init_by_page("", src); this.pos = 0; this.src = src; this.src_end = src.length; return this;} @@ -68,7 +69,7 @@ public class Bry_rdr { } return rv; } - public double Read_double_to() {return Read_double_to(dflt_dlm);} + public double Read_double_to() {return Read_double_to(dflt_dlm);} public double Read_double_to(byte to_char) { byte[] bry = Read_bry_to(to_char); return Double_.parse(String_.new_a7(bry)); diff --git a/100_core/src/gplx/core/brys/fmtrs/Bfr_fmt_arg.java b/100_core/src/gplx/core/brys/fmts/Bfr_fmt_arg.java similarity index 90% rename from 100_core/src/gplx/core/brys/fmtrs/Bfr_fmt_arg.java rename to 100_core/src/gplx/core/brys/fmts/Bfr_fmt_arg.java index 7cf0f1fb2..35866f1d6 100644 --- a/100_core/src/gplx/core/brys/fmtrs/Bfr_fmt_arg.java +++ b/100_core/src/gplx/core/brys/fmts/Bfr_fmt_arg.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.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; public class Bfr_fmt_arg { public Bfr_fmt_arg(byte[] key, Bfr_arg arg) {this.Key = key; this.Arg = arg;} public byte[] Key; diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_itm.java b/100_core/src/gplx/core/brys/fmts/Bry_fmt_itm.java similarity index 62% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_select_itm.java rename to 100_core/src/gplx/core/brys/fmts/Bry_fmt_itm.java index 825637152..95a9d8f9d 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_itm.java +++ b/100_core/src/gplx/core/brys/fmts/Bry_fmt_itm.java @@ -15,11 +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.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; -public class Sql_select_itm { - public boolean Distinct = false; - public final Sql_select_fld_list Flds = new Sql_select_fld_list(); +package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +public class Bry_fmt_itm { + public Bry_fmt_itm(int tid, int src_bgn, int src_end) { + this.Tid = tid; + this.Src_bgn = src_bgn; + this.Src_end = src_end; + } + public int Tid; + public int Src_bgn; + public int Src_end; + public int Key_idx; + public Bfr_arg Arg; - public static final Sql_select_itm All = all_(); - private static Sql_select_itm all_() {Sql_select_itm rv = new Sql_select_itm(); rv.Flds.Add(Sql_select_fld_wild.Instance); return rv;} + public static final int Tid__txt = 0, Tid__key = 1, Tid__arg = 2; } diff --git a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt_parser_.java b/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java similarity index 71% rename from 100_core/src/gplx/core/brys/fmtrs/Bry_fmt_parser_.java rename to 100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java index ac60ed338..4a9a3df6b 100644 --- a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt_parser_.java +++ b/100_core/src/gplx/core/brys/fmts/Bry_fmt_parser_.java @@ -15,8 +15,8 @@ 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.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*; -class Bry_fmt_parser_ { +package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +public class Bry_fmt_parser_ { public static Bry_fmt_itm[] Parse(byte escape, byte grp_bgn, byte grp_end, Bfr_fmt_arg[] args, byte[][] keys, byte[] src) { int src_len = src.length; int pos = 0; @@ -69,9 +69,25 @@ class Bry_fmt_parser_ { len = keys.length; for (int i = 0; i < len; ++i) { byte[] key = keys[i]; - Bry_fmt_itm key_itm = (Bry_fmt_itm)keys_hash.Get_by(key); if (key_itm == null) throw Err_.new_("bry_fmtr", "could not find key", "key", key); + Bry_fmt_itm key_itm = (Bry_fmt_itm)keys_hash.Get_by(key); if (key_itm == null) continue; // NOTE: ignore missing keys; EX: fmt=a~{b}c keys=b,d; do not fail b/c ~{d} is not in fmt; allows redefining from tests key_itm.Key_idx = i; } return rv; } + public static byte[][] Parse_keys(byte[] src) { + Ordered_hash list = Ordered_hash_.New_bry(); + int src_len = src.length; + int pos = -1; + while (pos < src_len) { + int lhs_pos = Bry_find_.Move_fwd(src, Bry_arg_lhs, pos + 1, src_len); + if (lhs_pos == Bry_find_.Not_found) break; // no more "~{" + int rhs_pos = Bry_find_.Find_fwd(src, Byte_ascii.Curly_end, lhs_pos, src_len); + if (rhs_pos == Bry_find_.Not_found) throw Err_.new_("bry_fmt", "unable to find closing }", "src", src); + if (rhs_pos - lhs_pos == 0) throw Err_.new_("bry_fmt", "{} will result in empty key", "src", src); + byte[] key = Bry_.Mid(src, lhs_pos, rhs_pos); + if (!list.Has(key)) list.Add(key, key); + pos = rhs_pos + 1; + } + return (byte[][])list.To_ary(byte[].class); + } private static final byte[] Bry_arg_lhs = Bry_.new_a7("~{"); } diff --git a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt_tst.java b/100_core/src/gplx/core/brys/fmts/Bry_fmt_tst.java similarity index 95% rename from 100_core/src/gplx/core/brys/fmtrs/Bry_fmt_tst.java rename to 100_core/src/gplx/core/brys/fmts/Bry_fmt_tst.java index 27c316fb4..9fa561e07 100644 --- a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt_tst.java +++ b/100_core/src/gplx/core/brys/fmts/Bry_fmt_tst.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.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; import org.junit.*; public class Bry_fmt_tst { private final Bry_fmt_fxt fxt = new Bry_fmt_fxt(); diff --git a/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java b/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_tst.java new file mode 100644 index 000000000..8dd54d946 --- /dev/null +++ b/100_core/src/gplx/core/brys/fmts/Bry_keys_parser_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.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*; +import org.junit.*; +public class Bry_keys_parser_tst { + private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt(); + @Test public void None() {fxt.Test("a");} + @Test public void One() {fxt.Test("~{a}" , "a");} + @Test public void Many() {fxt.Test("~{a}b~{c}d~{e}" , "a", "c", "e");} + @Test public void Dupe() {fxt.Test("~{a}b~{a}" , "a");} +} +class Bry_keys_parser_fxt { + public void Test(String fmt, String... expd) { + Tfds.Eq_ary(expd, String_.Ary(Bry_fmt_parser_.Parse_keys(Bry_.new_u8(fmt)))); + } +} 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 afd3987fa..8588a338a 100644 --- a/100_core/src/gplx/core/btries/Btrie_slim_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_slim_mgr.java @@ -41,6 +41,10 @@ public class Btrie_slim_mgr implements Btrie_mgr { cur = nxt; } } + public byte Match_byte_or(byte b, byte[] src, int bgn, int end, byte or) { + Object rv_obj = Match_bgn_w_byte(b, src, bgn, end); + return rv_obj == null ? or : ((Byte_obj_val)rv_obj).Val(); + } public byte Match_byte_or(byte[] src, int bgn, int end, byte or) { Object rv_obj = Match_bgn(src, bgn, end); return rv_obj == null ? or : ((Byte_obj_val)rv_obj).Val(); diff --git a/100_core/src/gplx/core/criterias/Criteria_between.java b/100_core/src/gplx/core/criterias/Criteria_between.java index a2b831d1a..699f56940 100644 --- a/100_core/src/gplx/core/criterias/Criteria_between.java +++ b/100_core/src/gplx/core/criterias/Criteria_between.java @@ -20,8 +20,8 @@ public class Criteria_between implements Criteria { public Criteria_between(boolean neg, Comparable lo, Comparable hi) {this.neg = neg; this.lo = lo; this.hi = hi;} public byte Tid() {return Criteria_.Tid_between;} public boolean Neg() {return neg;} private final boolean neg; - public Comparable Lo() {return lo;} private Comparable lo; - public Comparable Hi() {return hi;} private Comparable hi; + public Comparable Lo() {return lo;} private Comparable lo; public void Lo_(Comparable v) {this.lo = v;} + public Comparable Hi() {return hi;} private Comparable hi; public void Hi_(Comparable v) {this.hi = v;} public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();} public void Val_as_obj_(Object v) { Object[] ary = (Object[])v; diff --git a/100_core/src/gplx/core/criterias/Criteria_bool_base.java b/100_core/src/gplx/core/criterias/Criteria_bool_base.java index a6dddcae2..132467219 100644 --- a/100_core/src/gplx/core/criterias/Criteria_bool_base.java +++ b/100_core/src/gplx/core/criterias/Criteria_bool_base.java @@ -30,7 +30,7 @@ public abstract class Criteria_bool_base implements Criteria { } class Criteria_and extends Criteria_bool_base { public Criteria_and(Criteria lhs, Criteria rhs) {this.Ctor("AND", lhs, rhs);} - @Override public byte Tid() {return Criteria_.Tid_not;} + @Override public byte Tid() {return Criteria_.Tid_and;} @Override public boolean Matches(Object curVal) {return this.Lhs().Matches(curVal) && this.Rhs().Matches(curVal);} } class Criteria_or extends Criteria_bool_base { @@ -46,12 +46,3 @@ class Criteria_const implements Criteria { public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();} public String To_str() {return String_.Concat(" IS ", Bool_.To_str_lower(val));} } -class Criteria_not implements Criteria { - private final Criteria criteria; - public Criteria_not(Criteria v) {this.criteria = v;} - public byte Tid() {return Criteria_.Tid_not;} - public boolean Matches(Object obj) {return !criteria.Matches(obj);} - public void Val_from_args(Hash_adp args) {criteria.Val_from_args(args);} - public void Val_as_obj_(Object v) {criteria.Val_as_obj_(v);} - public String To_str() {return String_.Concat_any(" NOT ", criteria.To_str());} -} diff --git a/100_core/src/gplx/core/criterias/Criteria_fld.java b/100_core/src/gplx/core/criterias/Criteria_fld.java index 298f77444..d3fca2c6f 100644 --- a/100_core/src/gplx/core/criterias/Criteria_fld.java +++ b/100_core/src/gplx/core/criterias/Criteria_fld.java @@ -22,6 +22,7 @@ public class Criteria_fld implements Criteria { public String Pre() {return pre;} private final String pre; public String Key() {return key;} private final String key; public Criteria Crt() {return crt;} private final Criteria crt; + public String Pre_w_key() {return pre == Pre_null ? key : String_.Concat(pre, ".", key);} public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();} public void Val_from_args(Hash_adp args) { List_adp list = (List_adp)args.Get_by(key); if (list == null) throw Err_.new_wo_type("criteria.fld key not found", "key", key); @@ -31,7 +32,7 @@ public class Criteria_fld implements Criteria { public boolean Matches(Object invkObj) { GfoInvkAble invk = (GfoInvkAble)invkObj; if (key == Criteria_fld.Key_null) return crt.Matches(invkObj); - Object comp = GfoInvkAble_.InvkCmd(invk, key); + Object comp = GfoInvkAble_.InvkCmd(invk, this.Pre_w_key()); return crt.Matches(comp); } public String To_str() {return String_.Concat(key, " ", crt.To_str());} @@ -64,7 +65,7 @@ public class Criteria_fld implements Criteria { case Criteria_.Tid_wrapper: // not recursive case Criteria_.Tid_db_obj_ary: // unsupported case Criteria_.Tid_custom: - default: throw Err_.new_unhandled(tid); + default: throw Err_.new_unhandled(tid); } } } diff --git a/100_core/src/gplx/core/criterias/Criteria_ioMatch.java b/100_core/src/gplx/core/criterias/Criteria_ioMatch.java index b5ba51d98..13adafddc 100644 --- a/100_core/src/gplx/core/criterias/Criteria_ioMatch.java +++ b/100_core/src/gplx/core/criterias/Criteria_ioMatch.java @@ -20,7 +20,7 @@ import gplx.core.texts.*; public class Criteria_ioMatch implements Criteria { // EX: url IOMATCH '*.xml|*.txt' public Criteria_ioMatch(boolean match, RegxPatn_cls_ioMatch pattern) {this.match = match; this.pattern = pattern;} public byte Tid() {return Criteria_.Tid_iomatch;} - public boolean Neg() {return !match;} private final boolean match; + public boolean Neg() {return !match;} private final boolean match; public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();} public void Val_as_obj_(Object v) {this.pattern = (RegxPatn_cls_ioMatch)v;} public RegxPatn_cls_ioMatch Pattern() {return pattern;} private RegxPatn_cls_ioMatch pattern; diff --git a/100_core/src/gplx/core/criterias/Criteria_like.java b/100_core/src/gplx/core/criterias/Criteria_like.java index c3377f54c..b19f4d050 100644 --- a/100_core/src/gplx/core/criterias/Criteria_like.java +++ b/100_core/src/gplx/core/criterias/Criteria_like.java @@ -23,7 +23,7 @@ public class Criteria_like implements Criteria { public boolean Neg() {return neg;} private final boolean neg; public RegxPatn_cls_like Pattern() {return pattern;} private RegxPatn_cls_like pattern; public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();} - public void Val_as_obj_(Object v) {this.pattern = (RegxPatn_cls_like)v;} + public void Val_as_obj_(Object v) {this.pattern = RegxPatn_cls_like_.parse((String)v, RegxPatn_cls_like.EscapeDefault);} public boolean Matches(Object compObj) { String comp = String_.as_(compObj); if (comp == null) throw Err_.new_type_mismatch(String.class, compObj); boolean rv = pattern.Matches(comp); diff --git a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java b/100_core/src/gplx/core/criterias/Criteria_not.java similarity index 54% rename from 400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java rename to 100_core/src/gplx/core/criterias/Criteria_not.java index 0e49d255b..b4c67aac1 100644 --- a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_tkn.java +++ b/100_core/src/gplx/core/criterias/Criteria_not.java @@ -15,23 +15,13 @@ 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.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -class Srch_crt_tkn { - public final byte tid; - public final byte[] val; - public Srch_crt_tkn(byte tid, byte[] val) {this.tid = tid; this.val = val;} - - public static final byte - Tid_root = 1 - , Tid_word = 2 - , Tid_word_quoted = 3 - , Tid_space = 4 - , Tid_quote = 5 - , Tid_not = 6 - , Tid_paren_bgn = 7 - , Tid_paren_end = 8 - , Tid_or = 9 - , Tid_and = 10 - , Tid_eos = 11 - ; +package gplx.core.criterias; import gplx.*; import gplx.core.*; +public class Criteria_not implements Criteria { + public Criteria_not(Criteria v) {this.criteria = v;} + public byte Tid() {return Criteria_.Tid_not;} + public boolean Matches(Object obj) {return !criteria.Matches(obj);} + public void Val_from_args(Hash_adp args) {criteria.Val_from_args(args);} + public void Val_as_obj_(Object v) {criteria.Val_as_obj_(v);} + public String To_str() {return String_.Concat_any(" NOT ", criteria.To_str());} + public Criteria Crt() {return criteria;} private final Criteria criteria; } diff --git a/100_core/src/gplx/core/envs/Env_.java b/100_core/src/gplx/core/envs/Env_.java index 6e2f83283..37f60d1a5 100644 --- a/100_core/src/gplx/core/envs/Env_.java +++ b/100_core/src/gplx/core/envs/Env_.java @@ -56,7 +56,7 @@ public class Env_ { public static long System_memory_max() {return Runtime.getRuntime().maxMemory();} public static long System_memory_total() {return Runtime.getRuntime().totalMemory();} public static long System_memory_free() {return Runtime.getRuntime().freeMemory();} - public static final String LocalHost = "127.0.0.1"; + public static final String LocalHost = "127.0.0.1"; public static String NewLine_lang() {return mode_testing ? "\n" : "\n";} public static String GenHdr(boolean forSourceCode, String programName, String hdr_bgn, String hdr_end) { String newLine = Op_sys.Lnx.Nl_str(); @@ -68,7 +68,7 @@ public class Env_ { ( codeBgn , codeHdr , hdr_bgn - , "Copyright (c) 2012 gnosygnu@gmail.com", newLine + , "Copyright (c) 2012-2016 gnosygnu@gmail.com", newLine , newLine , "This program is free software: you can redistribute it and/or modify", lineEnd , "it under the terms of the GNU Affero General Public License as", lineEnd diff --git a/100_core/src/gplx/core/envs/Op_sys.java b/100_core/src/gplx/core/envs/Op_sys.java index f77d64c57..6f2aa3746 100644 --- a/100_core/src/gplx/core/envs/Op_sys.java +++ b/100_core/src/gplx/core/envs/Op_sys.java @@ -43,7 +43,7 @@ public class Op_sys { public static final char Dir_spr_char_lnx = '\n'; public static final Op_sys Lnx = new_unx_flavor_(Tid_lnx, "linux", Bitness_32); public static final Op_sys Osx = new_unx_flavor_(Tid_osx, "macosx", Bitness_32); - public static final Op_sys Drd = new_unx_flavor_(Tid_drd, "windows", Bitness_32); + public static final Op_sys Drd = new_unx_flavor_(Tid_drd, "android", Bitness_32); public static final Op_sys Wnt = new_wnt_(Sub_tid_unknown, Bitness_32); public static Op_sys Cur() {return cur_op_sys;} static Op_sys cur_op_sys = new_auto_identify_(); public static String Fsys_path_to_lnx(String v) { @@ -54,6 +54,15 @@ public class Op_sys { } private static Op_sys new_wnt_(byte bitness, byte sub_tid) {return new Op_sys(Tid_wnt , sub_tid , "windows", bitness, "\r\n", Byte_ascii.Backslash , Bool_.N);} private static Op_sys new_unx_flavor_(byte tid, String os_name, byte bitness) {return new Op_sys(tid , Sub_tid_unknown , os_name , bitness, "\n" , Byte_ascii.Slash , Bool_.Y);} + public static void Cur_(int tid) { + switch (tid) { + case Tid_wnt: cur_op_sys = Wnt; break; + case Tid_lnx: cur_op_sys = Lnx; break; + case Tid_osx: cur_op_sys = Osx; break; + case Tid_drd: cur_op_sys = Drd; break; + default: throw Err_.new_unhandled_default(tid); + } + } static final String GRP_KEY = "gplx.op_sys"; // public static Op_sys Cur_() {cur_op_sys = new_auto_identify_(); return cur_op_sys;} static Op_sys new_auto_identify_() { diff --git a/100_core/src/gplx/core/interfaces/SrlAble_.java b/100_core/src/gplx/core/interfaces/SrlAble_.java index 4b6357444..48be1449c 100644 --- a/100_core/src/gplx/core/interfaces/SrlAble_.java +++ b/100_core/src/gplx/core/interfaces/SrlAble_.java @@ -36,7 +36,7 @@ public class SrlAble_ { sb.Add(owner.Key()).Add(":"); for (int i = 0; i < owner.Args_count(); i++) { if (i != 0) sb.Add(" "); - KeyVal kv = owner.Args_getAt(i); + Keyval kv = owner.Args_getAt(i); sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.Xto_str_strict_or_null_mark(kv.Val())).Add("'"); } int subsCount = owner.Subs_count(); diff --git a/100_core/src/gplx/core/js/Js_wtr.java b/100_core/src/gplx/core/js/Js_wtr.java index 95c060127..cc1c65316 100644 --- a/100_core/src/gplx/core/js/Js_wtr.java +++ b/100_core/src/gplx/core/js/Js_wtr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.core.js; import gplx.*; import gplx.core.*; public class Js_wtr { - private final Bry_bfr bfr = Bry_bfr.reset_(255); + private final Bry_bfr bfr = Bry_bfr.reset_(32); private int arg_idx = 0, ary_idx = 0; public byte Quote_char() {return quote_char;} public Js_wtr Quote_char_(byte v) {quote_char = v; return this;} private byte quote_char = Byte_ascii.Quote; public void Clear() {bfr.Clear();} diff --git a/100_core/src/gplx/core/lists/ComparerAble.java b/100_core/src/gplx/core/lists/ComparerAble.java index c70ca0801..e676f93c4 100644 --- a/100_core/src/gplx/core/lists/ComparerAble.java +++ b/100_core/src/gplx/core/lists/ComparerAble.java @@ -16,5 +16,5 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.lists; import gplx.*; import gplx.core.*; -public interface ComparerAble extends java.util.Comparator {} //_20110320 +public interface ComparerAble extends java.util.Comparator {} // public int compare(Object lhsObj, Object rhsObj) {} diff --git a/100_core/src/gplx/core/lists/Hash_adp_base.java b/100_core/src/gplx/core/lists/Hash_adp_base.java index aa2b66072..1f26d9845 100644 --- a/100_core/src/gplx/core/lists/Hash_adp_base.java +++ b/100_core/src/gplx/core/lists/Hash_adp_base.java @@ -20,14 +20,6 @@ public abstract class Hash_adp_base implements Hash_adp { public boolean Has(Object key) {return Has_base(key);} public Object Get_by(Object key) {return Fetch_base(key);} public Object Get_by_or_fail(Object key) {return Get_by_or_fail_base(key);} -// public Object Get_by_or_new(Object key, NewAble proto) { -// Object rv = Fetch_base(key); -// if (rv == null) { -// rv = proto.NewByKey(key); -// Add_base(key, rv); -// } -// return rv; -// } public void Add(Object key, Object val) {Add_base(key, val);} public void Add_as_key_and_val(Object val) {Add_base(val, val);} public void Add_if_dupe_use_nth(Object key, Object val) { diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_lnr.java b/100_core/src/gplx/core/lists/List_adp__getable.java similarity index 79% rename from 400_xowa/src/gplx/xowa/specials/search/Srch_rslt_lnr.java rename to 100_core/src/gplx/core/lists/List_adp__getable.java index 0d32723bc..a98b79241 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_lnr.java +++ b/100_core/src/gplx/core/lists/List_adp__getable.java @@ -15,7 +15,8 @@ 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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -public interface Srch_rslt_lnr { - void Notify_rslt_found(Srch_rslt_itm rslt); +package gplx.core.lists; import gplx.*; import gplx.core.*; +public interface List_adp__getable { + int Len(); + Object Get_at(int i); } diff --git a/100_core/src/gplx/core/stores/DataRdr.java b/100_core/src/gplx/core/stores/DataRdr.java index a7664bef3..9e1cd1b24 100644 --- a/100_core/src/gplx/core/stores/DataRdr.java +++ b/100_core/src/gplx/core/stores/DataRdr.java @@ -26,7 +26,7 @@ public interface DataRdr extends SrlMgr, Rls_able { int FieldCount(); String KeyAt(int i); Object ReadAt(int i); - KeyVal KeyValAt(int i); + Keyval KeyValAt(int i); Object Read(String key); String ReadStr(String key); String ReadStrOr(String key, String or); diff --git a/100_core/src/gplx/core/stores/DataRdr_.java b/100_core/src/gplx/core/stores/DataRdr_.java index 5ce373df4..cc924846d 100644 --- a/100_core/src/gplx/core/stores/DataRdr_.java +++ b/100_core/src/gplx/core/stores/DataRdr_.java @@ -37,7 +37,7 @@ class DataRdr_null implements DataRdr { public int FieldCount() {return 0;} public String KeyAt(int i) {return To_str();} public Object ReadAt(int i) {return null;} - public KeyVal KeyValAt(int i) {return KeyVal_.new_(this.KeyAt(i), this.ReadAt(i));} + public Keyval KeyValAt(int i) {return Keyval_.new_(this.KeyAt(i), this.ReadAt(i));} public Object Read(String name) {return null;} public String ReadStr(String key) {return String_.Empty;} public String ReadStrOr(String key, String or) {return or;} public byte[] ReadBryByStr(String key) {return Bry_.Empty;} public byte[] ReadBryByStrOr(String key, byte[] or) {return or;} diff --git a/100_core/src/gplx/core/stores/DataRdr_base.java b/100_core/src/gplx/core/stores/DataRdr_base.java index 9eef9e0cb..bf549eb67 100644 --- a/100_core/src/gplx/core/stores/DataRdr_base.java +++ b/100_core/src/gplx/core/stores/DataRdr_base.java @@ -27,7 +27,7 @@ public abstract class DataRdr_base implements SrlMgr { public abstract int FieldCount(); public abstract String KeyAt(int i); public abstract Object ReadAt(int i); - @gplx.Virtual public KeyVal KeyValAt(int idx) {return KeyVal_.new_(this.KeyAt(idx), ReadAt(idx));} + @gplx.Virtual public Keyval KeyValAt(int idx) {return Keyval_.new_(this.KeyAt(idx), ReadAt(idx));} public String ReadStr(String key) { Object val = Read(key); try {return (String)val;} @@ -192,7 +192,7 @@ public abstract class DataRdr_base implements SrlMgr { public void XtoStr_gfml(String_bldr sb) { sb.Add(this.NameOfNode()).Add(":"); for (int i = 0; i < this.FieldCount(); i++) { - KeyVal kv = this.KeyValAt(i); + Keyval kv = this.KeyValAt(i); if (i != 0) sb.Add(" "); sb.Add_fmt("{0}='{1}'", kv.Key(), String_.Replace(kv.Val_to_str_or_empty(), "'", "\"")); } diff --git a/100_core/src/gplx/core/stores/GfoNdeRdr_.java b/100_core/src/gplx/core/stores/GfoNdeRdr_.java index 1e5ece94f..48f89f21a 100644 --- a/100_core/src/gplx/core/stores/GfoNdeRdr_.java +++ b/100_core/src/gplx/core/stores/GfoNdeRdr_.java @@ -18,12 +18,12 @@ along with this program. If not, see . package gplx.core.stores; import gplx.*; import gplx.core.*; import gplx.core.gfo_ndes.*; import gplx.core.type_xtns.*; public class GfoNdeRdr_ { - public static GfoNdeRdr kvs_(KeyValList kvList) { + public static GfoNdeRdr kvs_(Keyval_list kvList) { GfoFldList flds = GfoFldList_.new_(); int pairsLen = kvList.Count(); Object[] vals = new Object[pairsLen]; for (int i = 0; i < pairsLen; i++) { - KeyVal pair = kvList.GetAt(i); + Keyval pair = kvList.Get_at(i); flds.Add(pair.Key(), StringClassXtn.Instance); vals[i] = pair.Val_to_str_or_empty(); } diff --git a/100_core/src/gplx/langs/gfs/Gfs_Date_tst.java b/100_core/src/gplx/langs/gfs/Gfs_Date_tst.java index 49538c93f..f19c8b737 100644 --- a/100_core/src/gplx/langs/gfs/Gfs_Date_tst.java +++ b/100_core/src/gplx/langs/gfs/Gfs_Date_tst.java @@ -27,12 +27,12 @@ public class Gfs_Date_tst { fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now")), DateAdp_.parse_gplx("2001-01-01 00:00:00.000")); } @Test public void Add_day() { - fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now", "Add_day"), KeyVal_.new_("days", 1)), DateAdp_.parse_gplx("2001-01-02 00:00:00.000")); + fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now", "Add_day"), Keyval_.new_("days", 1)), DateAdp_.parse_gplx("2001-01-02 00:00:00.000")); } } class GfsCoreFxt { public GfsCore Core() {return core;} GfsCore core = GfsCore.new_(); - public GfoMsg msg_(String[] ary, KeyVal... kvAry) {return GfoMsg_.root_leafArgs_(ary, kvAry);} + public GfoMsg msg_(String[] ary, Keyval... kvAry) {return GfoMsg_.root_leafArgs_(ary, kvAry);} public void AddObj(GfoInvkAble invk, String s) {core.AddObj(invk, s);} public void tst_MsgStr(GfoMsg msg, Object expd) { GfsCtx ctx = GfsCtx.new_(); diff --git a/100_core/src/gplx/langs/xmls/Xpath_.java b/100_core/src/gplx/langs/xmls/Xpath_.java index 88336556c..9621d17b8 100644 --- a/100_core/src/gplx/langs/xmls/Xpath_.java +++ b/100_core/src/gplx/langs/xmls/Xpath_.java @@ -57,14 +57,14 @@ public class Xpath_ { } } public static final String InnetTextKey = "&innerText"; - public static KeyValHash ExtractKeyVals(String xml, Int_obj_ref posRef, String nodeName) { + public static Keyval_hash ExtractKeyVals(String xml, Int_obj_ref posRef, String nodeName) { int pos = posRef.Val(); Err xmlErr = Err_.new_wo_type("error parsing xml", "xml", xml, "pos", pos); String headBgnFind = "<" + nodeName + " "; int headBgnFindLen = String_.Len(headBgnFind); int headBgn = String_.FindFwd(xml, headBgnFind, pos); if (headBgn == String_.Find_none) return null; int headEnd = String_.FindFwd(xml, ">", headBgn + headBgnFindLen); if (headEnd == String_.Find_none) throw xmlErr; String atrXml = String_.Mid(xml, headBgn, headEnd); - KeyValHash rv = ExtractNodeVals(atrXml, xmlErr); + Keyval_hash rv = ExtractNodeVals(atrXml, xmlErr); boolean noInnerText = String_.CharAt(xml, headEnd - 1) == '/'; // if />, then no inner text if (!noInnerText) { int tail = String_.FindFwd(xml, "", headBgn); if (tail == String_.Find_none) throw Err_.new_wo_type("could not find tailPos", "headBgn", headBgn); @@ -74,8 +74,8 @@ public class Xpath_ { posRef.Val_(headEnd); return rv; } - static KeyValHash ExtractNodeVals(String xml, Err xmlErr) { - KeyValHash rv = KeyValHash.new_(); + static Keyval_hash ExtractNodeVals(String xml, Err xmlErr) { + Keyval_hash rv = new Keyval_hash(); int pos = 0; while (true) { int eqPos = String_.FindFwd(xml, "=", pos); if (eqPos == String_.Find_none) break; diff --git a/110_gfml/.project b/110_gfml/.project deleted file mode 100644 index 2ccedcf3e..000000000 --- a/110_gfml/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 110_gfml - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/110_gfml/src_100_tkn/gplx/gfml/GfmlLxr_.java b/110_gfml/src_100_tkn/gplx/gfml/GfmlLxr_.java index 322a01e48..92d500b4d 100644 --- a/110_gfml/src_100_tkn/gplx/gfml/GfmlLxr_.java +++ b/110_gfml/src_100_tkn/gplx/gfml/GfmlLxr_.java @@ -52,7 +52,7 @@ class GfmlLxr_singleton implements GfmlLxr, GfoEvObj { String oldRaw = singletonTkn.Raw(); singletonTkn = val; hooks = String_.Ary(val.Raw()); - GfoEvMgr_.PubVals(this, GfmlLxr_.CmdTknChanged_evt, KeyVal_.new_("old", oldRaw), KeyVal_.new_("new", val.Raw()), KeyVal_.new_("lxr", this)); + GfoEvMgr_.PubVals(this, GfmlLxr_.CmdTknChanged_evt, Keyval_.new_("old", oldRaw), Keyval_.new_("new", val.Raw()), Keyval_.new_("lxr", this)); } public String[] Hooks() {return hooks;} private String[] hooks; public GfmlTkn MakeTkn(CharStream stream, int hookLength) { diff --git a/110_gfml/tst/gplx/gfml/yfxts_GfmlParse_fxt.java b/110_gfml/tst/gplx/gfml/yfxts_GfmlParse_fxt.java index 5780d9de2..38fb7dc41 100644 --- a/110_gfml/tst/gplx/gfml/yfxts_GfmlParse_fxt.java +++ b/110_gfml/tst/gplx/gfml/yfxts_GfmlParse_fxt.java @@ -60,14 +60,14 @@ class GfmlParse_fxt { UsrMsg_mok actlUmm = UsrMsg_mok.new_(actlUm); tstr.Eq_str(expdUm.Main(), actlUmm.Main(), "main"); for (int j = 0; j < expdUm.Args().Count(); j++) { - KeyVal expdKv = (KeyVal)expdUm.Args().Get_at(j); - KeyVal actlKv = (KeyVal)actlUmm.Args().Get_by(expdKv.Key()); + Keyval expdKv = (Keyval)expdUm.Args().Get_at(j); + Keyval actlKv = (Keyval)actlUmm.Args().Get_by(expdKv.Key()); Object actlVal = actlKv == null ? String_.Null_mark : actlKv.Val(); tstr.Eq_str(expdKv.Val(), actlVal, expdKv.Key()); } for (int j = 0; j < expdUm.Required().Count(); j++) { String expdKv = (String)expdUm.Required().Get_at(j); - KeyVal actlKv = (KeyVal)actlUmm.Args().Get_by(expdKv); + Keyval actlKv = (Keyval)actlUmm.Args().Get_by(expdKv); Object actlVal = actlKv == null ? String_.Null_mark : actlKv.Val(); Object actlValV = actlKv == null ? "<>" : actlKv.Val(); tstr.Eq_str(actlValV, actlVal, expdKv); diff --git a/110_gfml/tst/gplx/gfml/ymoks_UsrMsg_mok.java b/110_gfml/tst/gplx/gfml/ymoks_UsrMsg_mok.java index b7031c9de..c39838182 100644 --- a/110_gfml/tst/gplx/gfml/ymoks_UsrMsg_mok.java +++ b/110_gfml/tst/gplx/gfml/ymoks_UsrMsg_mok.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.gfml; import gplx.*; class UsrMsg_mok { public String Main() {return main;} public UsrMsg_mok Main_(String v) {main = v; return this;} private String main; - public UsrMsg_mok Add_(String k, Object o) {hash.Add(k, KeyVal_.new_(k, o)); return this;} + public UsrMsg_mok Add_(String k, Object o) {hash.Add(k, Keyval_.new_(k, o)); return this;} public UsrMsg_mok Require_(String k) {required.Add(k, k); return this;} public Ordered_hash Args() {return hash;} Ordered_hash hash = Ordered_hash_.New(); public Ordered_hash Required() {return required;} Ordered_hash required = Ordered_hash_.New(); @@ -27,7 +27,7 @@ class UsrMsg_mok { if (um != null) { rv.main = um.Hdr(); for (int i = 0; i < um.Args().Count(); i++) { - KeyVal kv = (KeyVal)um.Args().Get_at(i); + Keyval kv = (Keyval)um.Args().Get_at(i); rv.Add_(kv.Key(), kv.Val()); } } diff --git a/110_gfml/tst/gplx/gfml/z801_useCase_DataRdr_tst.java b/110_gfml/tst/gplx/gfml/z801_useCase_DataRdr_tst.java index 927d1acc3..11cd5dbc8 100644 --- a/110_gfml/tst/gplx/gfml/z801_useCase_DataRdr_tst.java +++ b/110_gfml/tst/gplx/gfml/z801_useCase_DataRdr_tst.java @@ -58,7 +58,7 @@ public class z801_useCase_DataRdr_tst { subRdr = rdr.Subs_byName_moveFirst("point"); fx_rdr.tst_Atrs(subRdr, kv_("x", "1"), kv_("y", "2")); } - KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);} + Keyval kv_(String key, Object val) {return Keyval_.new_(key, val);} DataRdr_Fxt fx_rdr = DataRdr_Fxt.Instance; DataRdr rdr, subRdr; } @@ -71,8 +71,8 @@ class DataRdr_Fxt { } return rv; } - @gplx.Internal protected void tst_Atrs(DataRdr rdr, KeyVal... expdAry) { - KeyVal[] actlAry = new KeyVal[rdr.FieldCount()]; + @gplx.Internal protected void tst_Atrs(DataRdr rdr, Keyval... expdAry) { + Keyval[] actlAry = new Keyval[rdr.FieldCount()]; for (int i = 0; i < actlAry.length; i++) actlAry[i] = rdr.KeyValAt(i); Tfds.Eq_ary_str(expdAry, actlAry); diff --git a/140_dbs/.classpath b/140_dbs/.classpath index 88a4ccc1d..114a8e7cf 100644 --- a/140_dbs/.classpath +++ b/140_dbs/.classpath @@ -9,6 +9,6 @@ - + diff --git a/140_dbs/.project b/140_dbs/.project deleted file mode 100644 index 820afe209..000000000 --- a/140_dbs/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 140_dbs - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/140_dbs/lib/mysql-connector-java-5.1.12-bin.jar b/140_dbs/lib/mysql-connector-java-5.1.12-bin.jar deleted file mode 100644 index af5847eed..000000000 Binary files a/140_dbs/lib/mysql-connector-java-5.1.12-bin.jar and /dev/null differ diff --git a/140_dbs/lib/postgresql-8.4-701.jdbc4.jar b/140_dbs/lib/postgresql-8.4-701.jdbc4.jar deleted file mode 100644 index e21beec54..000000000 Binary files a/140_dbs/lib/postgresql-8.4-701.jdbc4.jar and /dev/null differ diff --git a/140_dbs/lib/sqlite-jdbc-3.7.15-M1.jar b/140_dbs/lib/sqlite-jdbc-3.7.15-M1.jar deleted file mode 100644 index 97b306f23..000000000 Binary files a/140_dbs/lib/sqlite-jdbc-3.7.15-M1.jar and /dev/null differ diff --git a/140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java b/140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java index 0aa172d01..9a351a058 100644 --- a/140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java +++ b/140_dbs/src/gplx/core/srls/Dbmeta_dat_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.core.srls; import gplx.*; import gplx.core.*; -import gplx.dbs.metas.*; +import gplx.dbs.*; import gplx.dbs.metas.*; public class Dbmeta_dat_mgr { private final Ordered_hash hash = Ordered_hash_.New(); public Dbmeta_dat_mgr Clear() {hash.Clear(); return this;} diff --git a/140_dbs/src/gplx/core/stores/DbMaprItm.java b/140_dbs/src/gplx/core/stores/DbMaprItm.java index 13a66f480..0de92505e 100644 --- a/140_dbs/src/gplx/core/stores/DbMaprItm.java +++ b/140_dbs/src/gplx/core/stores/DbMaprItm.java @@ -29,7 +29,7 @@ public class DbMaprItm { contextFlds.Add(arg.ObjProp(), arg); return this; } - public DbMaprItm ConstantFlds_add(String dbFld, Object dbVal) {constantFlds.Add(dbFld, KeyVal_.new_(dbFld, dbVal)); return this;} + public DbMaprItm ConstantFlds_add(String dbFld, Object dbVal) {constantFlds.Add(dbFld, Keyval_.new_(dbFld, dbVal)); return this;} public DbMaprItm Subs_add(DbMaprItm... ary) { for (DbMaprItm itm : ary) subs.Add(itm); diff --git a/140_dbs/src/gplx/core/stores/DbMaprMgr_tst.java b/140_dbs/src/gplx/core/stores/DbMaprMgr_tst.java index 6f14d8755..bb7ea41ef 100644 --- a/140_dbs/src/gplx/core/stores/DbMaprMgr_tst.java +++ b/140_dbs/src/gplx/core/stores/DbMaprMgr_tst.java @@ -44,16 +44,16 @@ public class DbMaprMgr_tst { } DbMaprMgr mgr; DbMaprWtr wtr; Db_conn conn; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr; @Test public void PurgeObjTree() { disc = MockDisc.new_().Id_(1); - Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1)); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1)); DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn); Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs")); } @Test public void PurgeObjTree_deep() { disc = MockDisc.new_().Id_(1); - Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1)); - Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1)); - Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3)); - Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3)); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1)); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1)); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3)); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3)); DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn); Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs")); @@ -92,7 +92,7 @@ public class DbMaprMgr_tst { } @Test public void Load_root() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name")); disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null); Tfds.Eq(1, disc.Id()); @@ -101,9 +101,9 @@ public class DbMaprMgr_tst { } @Test public void Load_subs() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); - Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); - Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("title_name", "title2")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 2).Add("title_name", "title2")); disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null); Tfds.Eq(1, disc.Id()); @@ -114,11 +114,11 @@ public class DbMaprMgr_tst { } @Test public void Load_deep() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); - Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); - Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1")); - Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1")); - Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1")); + Db_qry_fxt.Insert_kvo(conn, "mock_streams", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1")); + Db_qry_fxt.Insert_kvo(conn, "mock_streams", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1")); disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null); Tfds.Eq(1, disc.Id()); diff --git a/140_dbs/src/gplx/core/stores/DbMaprRdr.java b/140_dbs/src/gplx/core/stores/DbMaprRdr.java index a5fb79998..dfa861572 100644 --- a/140_dbs/src/gplx/core/stores/DbMaprRdr.java +++ b/140_dbs/src/gplx/core/stores/DbMaprRdr.java @@ -50,7 +50,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { Criteria rv = null, cur = null; List_adp list = GetIdxFlds(mgr, mapr); for (Object kvObj : list) { - KeyVal kv = (KeyVal)kvObj; + Keyval kv = (Keyval)kvObj; cur = Db_crt_.New_eq(kv.Key(), kv.Val()); rv = (rv == null) ? cur : Criteria_.And(rv, cur); } @@ -65,11 +65,11 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { for (Object argObj : mapr.ContextFlds()) { DbMaprArg arg = (DbMaprArg)argObj; Object propVal = GfoInvkAble_.InvkCmd((GfoInvkAble)gobj, arg.ObjProp()); - rv.Add(KeyVal_.new_(arg.DbFld(), propVal)); + rv.Add(Keyval_.new_(arg.DbFld(), propVal)); } } for (Object argObj : curMapr.ConstantFlds()) { - KeyVal arg = (KeyVal)argObj; + Keyval arg = (Keyval)argObj; rv.Add(arg); } return rv; @@ -109,7 +109,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { @Override public int FieldCount() {throw Err_.new_unimplemented();} @Override public String KeyAt(int i) {throw Err_.new_unimplemented();} @Override public Object ReadAt(int i) {throw Err_.new_unimplemented();} - @Override public KeyVal KeyValAt(int i) {throw Err_.new_unimplemented();} + @Override public Keyval KeyValAt(int i) {throw Err_.new_unimplemented();} @Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprRdr();} Hash_adp tables = Hash_adp_.new_(); Db_conn conn; Criteria rootCrt; diff --git a/140_dbs/src/gplx/dbs/Db_attach_itm.java b/140_dbs/src/gplx/dbs/Db_attach_itm.java new file mode 100644 index 000000000..94a37cea7 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_attach_itm.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.dbs; import gplx.*; +public class Db_attach_itm { + public Db_attach_itm(String key, Io_url url) { + this.Key = key; this.Url = url; + } + public Db_attach_itm(String key, Db_conn conn) { + this.Key = key; this.Url = gplx.dbs.engines.sqlite.Sqlite_conn_info.To_url(conn); + } + public final String Key; + public final Io_url Url; +} diff --git a/140_dbs/src/gplx/dbs/Db_attach_mgr.java b/140_dbs/src/gplx/dbs/Db_attach_mgr.java new file mode 100644 index 000000000..ac5f2422f --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_attach_mgr.java @@ -0,0 +1,120 @@ +/* +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.dbs; import gplx.*; +import gplx.dbs.sqls.*; import gplx.dbs.sqls.itms.*; +public class Db_attach_mgr { + private final Ordered_hash hash = Ordered_hash_.New(); + public final List_adp attached_dbs_list = List_adp_.new_(); + public String Attached_sql() {return attached_sql;} private String attached_sql; // TEST + private Db_conn main_conn; private Io_url main_conn_url; + public Db_attach_mgr() {} + public Db_attach_mgr(Db_conn main_conn, Db_attach_itm... itms_ary) { + this.Main_conn_(main_conn); + this.Init(itms_ary); + } + public Db_attach_mgr Init(Db_attach_itm... itms_ary) { + hash.Clear(); + int itms_len = itms_ary.length; + for (int i = 0; i < itms_len; ++i) { + Db_attach_itm itm = itms_ary[i]; + hash.Add(itm.Key, itm); + } + return this; + } + public Db_attach_mgr Main_conn_(Db_conn conn) { + this.main_conn = conn; this.main_conn_url = Db_conn_info_.To_url(conn.Conn_info()); + return this; + } + public void Attach() { + int len = attached_dbs_list.Len(); + for (int i = 0; i < len; ++i) { + Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i); + main_conn.Env_db_attach(itm.Key, itm.Url); + } + } + public void Detach() { + int len = attached_dbs_list.Len(); + for (int i = 0; i < len; ++i) { + Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i); + main_conn.Env_db_detach(itm.Key); + } + attached_dbs_list.Clear(); // clear list so multiple detachs don't fail + } + public String List__to_str() { + String rv = ""; + int len = attached_dbs_list.Len(); + for (int i = 0; i < len; ++i) { + Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i); + rv += itm.Key + ";"; + } + return rv; + } + public String Resolve_sql(String sql) { + attached_dbs_list.Clear(); + int hash_len = hash.Count(); + for (int i = 0; i < hash_len; ++i) { + Db_attach_itm attach_itm = (Db_attach_itm)hash.Get_at(i); + String tkn = "<" + attach_itm.Key + ">"; + if (String_.Has(sql, tkn)) { + Io_url attach_url = attach_itm.Url; + String repl = ""; + if (!attach_url.Eq(main_conn_url)) { + repl = attach_itm.Key + "."; + attached_dbs_list.Add(attach_itm); + } + sql = String_.Replace(sql, tkn, repl); + } + } + attached_sql = sql; + return sql; + } + public Db_stmt Make_stmt_and_attach(Db_qry qry, gplx.dbs.sqls.itms.Sql_from_clause from_itm) { + attached_dbs_list.Clear(); + Sql_qry_wtr sql_wtr = main_conn.Engine().Sql_wtr(); + List_adp from_tbls = from_itm.Tbls; + int from_tbls_len = from_tbls.Count(); + for (int i = 0; i < from_tbls_len; ++i) { + Sql_tbl_itm from_tbl = (Sql_tbl_itm)from_tbls.Get_at(i); + String from_tbl_db = from_tbl.Db; + if (String_.Eq(Sql_tbl_itm.Db__null, from_tbl_db)) continue; // tbl does not have db defined; only "tbl" not "db.tbl"; skip + Db_attach_itm attach_itm = (Db_attach_itm)hash.Get_by(from_tbl_db); if (attach_itm == null) throw Err_.new_("dbs", "qry defines an unknown database for attach_wkr", "from_tbl_db", from_tbl_db, "sql", qry.To_sql__exec(sql_wtr)); + if (attach_itm.Url.Eq(main_conn_url)) // attach_db same as conn; blank db, so "tbl", not "db.tbl" + from_tbl.Db_enabled = false; + else + attached_dbs_list.Add(attach_itm); + } + attached_sql = sql_wtr.To_sql_str(qry, true); + this.Attach(); + for (int i = 0; i < from_tbls_len; ++i) { // reverse blanking from above + Sql_tbl_itm from_tbl = (Sql_tbl_itm)from_tbls.Get_at(i); + from_tbl.Db_enabled = true; + } + return main_conn.Stmt_sql(attached_sql); + } + public Db_attach_mgr Exec_sql_w_msg(String msg, String sql, Object... args) { + Gfo_usr_dlg_.Instance.Plog_many("", "", msg); + Exec_sql(sql, args); + return this; + } + public void Exec_sql(String sql, Object... args) { + String attach_sql = String_.Format(Resolve_sql(sql), args); + this.Attach(); + try {main_conn.Exec_sql(attach_sql);} + finally {this.Detach();} + } +} diff --git a/140_dbs/src/gplx/dbs/Db_attach_mgr__tst.java b/140_dbs/src/gplx/dbs/Db_attach_mgr__tst.java new file mode 100644 index 000000000..0642fece0 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_attach_mgr__tst.java @@ -0,0 +1,65 @@ +/* +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.dbs; import gplx.*; +import org.junit.*; import gplx.dbs.qrys.*; +public class Db_attach_mgr__tst { + private final Db_attach_mgr__fxt fxt = new Db_attach_mgr__fxt(); + @Test public void Basic() { + Db_qry__select_cmd qry = Db_qry_.select_() + .Cols_w_tbl_("t1", "fld_1") + .Cols_w_tbl_("t2", "fld_2") + .Cols_w_tbl_("t3", "fld_3") + .From_("db_1", "tbl_1", "t1") + .Join_("db_2", "tbl_2", "t2", Db_qry_.New_join__same("t1", "fld_2")) + .Join_("db_3", "tbl_3", "t3", Db_qry_.New_join__same("t1", "fld_3")) + .Join_( "tbl_4", "t4", Db_qry_.New_join__same("t1", "fld_4")) + ; + fxt.Init("db_2", fxt.Make__itm("db_1"), fxt.Make__itm("db_2"), fxt.Make__itm("db_3")); + fxt.Test__make_stmt_and_attach(qry + , "SELECT t1.fld_1, t2.fld_2, t3.fld_3 " + + "FROM db_1.tbl_1 t1 " + + "INNER JOIN tbl_2 t2 ON t1.fld_2 = t2.fld_2 " // NOTE: curr is db_2 so do not prefix tbl_2 with db_2; fails if "db_2.tbl_2" + + "INNER JOIN db_3.tbl_3 t3 ON t1.fld_3 = t3.fld_3 " + + "INNER JOIN tbl_4 t4 ON t1.fld_4 = t4.fld_4" + , String_.Ary("db_1", "db_3") // NOTE: no "db_2" + ); + } +} +class Db_attach_mgr__fxt { + private Db_attach_mgr mgr; + public Db_attach_itm Make__itm(String key) {return new Db_attach_itm(key, Io_url_.mem_fil_("mem/" + key));} + public Db_conn Make__conn(String key) {return Db_conn_pool.Instance.Get_or_new__mem(key);} + public void Init(String conn_key, Db_attach_itm... ary) { + Db_conn conn = Make__conn(conn_key); + mgr = new Db_attach_mgr(conn, ary); + } + public void Test__make_stmt_and_attach(Db_qry__select_cmd qry, String expd_sql, String[] expd_dbs) { + mgr.Make_stmt_and_attach(qry, qry.From()); + Tfds.Eq_str(expd_sql, mgr.Attached_sql()); + Tfds.Eq_ary_str(expd_dbs, To_key_ary(mgr.attached_dbs_list)); + } + private static String[] To_key_ary(List_adp attach_dbs_list) { + int rv_len = attach_dbs_list.Count(); + String[] rv = new String[rv_len]; + for (int i = 0; i < rv_len; ++i) { + Db_attach_itm itm = (Db_attach_itm)attach_dbs_list.Get_at(i); + rv[i] = itm.Key; + } + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index 1d8a0273c..50e7d92ff 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -16,46 +16,71 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; +import gplx.core.brys.fmtrs.*; import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sys.*; public class Db_conn { - private final List_adp rls_list = List_adp_.new_(); private final Db_engine engine; + private final Db_engine engine; private final List_adp rls_list = List_adp_.new_(); + private final Bry_fmt exec_sql_fmt = Bry_fmt.New(""); private final Bry_bfr exec_sql_bfr = Bry_bfr.new_(); public Db_conn(Db_engine engine) { this.engine = engine; sys_mgr = new Db_sys_mgr(this); } public Db_engine Engine() {return engine;} public Db_conn_info Conn_info() {return engine.Conn_info();} - public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Xto_api(), comp.Conn_info().Xto_api());} + public Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr; + public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Db_api(), comp.Conn_info().Db_api());} public void Txn_bgn(String name) {engine.Txn_bgn(name);} public void Txn_end() {engine.Txn_end();} public void Txn_cxl() {engine.Txn_cxl();} public void Txn_sav() {engine.Txn_sav();} - public Db_stmt Stmt_insert(String tbl, Dbmeta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));} - public Db_stmt Stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));} - public Db_stmt Stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, cols));} - public Db_stmt Stmt_update_exclude(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, flds.To_str_ary_exclude(where)));} - public Db_stmt Stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));} - public Db_stmt Stmt_select(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols, null));} - public Db_stmt Stmt_select(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));} - public Db_stmt Stmt_select_max(String tbl, String col, String... where) { - Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl, String_.Ary(String_.Format("Max({0}) AS {0}", col)), where, null, null, null, null); - return engine.New_stmt_prep(qry); - } + public void Env_db_attach(String alias, Db_conn conn) {engine.Env_db_attach(alias, conn);} + public void Env_db_attach(String alias, Io_url db_url) {engine.Env_db_attach(alias, db_url);} + public void Env_db_detach(String alias) {engine.Env_db_detach(alias);} + public void Env_vacuum() {Exec_sql_plog_ntx("vacuuming: url=" + this.Conn_info().Db_api(), "VACUUM;");} + public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);} + public void Meta_tbl_create(Dbmeta_tbl_itm meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs().To_ary());} + public void Meta_tbl_drop(String tbl) {engine.Ddl_delete_tbl(tbl);} + public void Meta_idx_create(Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);} + public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} + public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);} + public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {engine.Ddl_append_fld(tbl, fld);} + public void Meta_fld_assert(String tbl, String fld, Dbmeta_fld_tid tid, Object dflt) {if (!Meta_fld_exists(tbl, fld)) this.Meta_fld_append(tbl, new Dbmeta_fld_itm(fld, tid).Default_(dflt));} + public Dbmeta_tbl_mgr Meta_load_all() {return engine.Meta_tbl_load_all();} + public Db_stmt Stmt_insert(String tbl, Dbmeta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));} + public Db_stmt Stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));} + public Db_stmt Stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, cols));} + public Db_stmt Stmt_update_exclude(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, flds.To_str_ary_exclude(where)));} + public Db_stmt Stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));} + public Db_stmt Stmt_select(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols, null));} + public Db_stmt Stmt_select(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));} public Db_stmt Stmt_select_order(String tbl, Dbmeta_fld_list flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), orderbys));} public Db_stmt Stmt_select_order(String tbl, String[] flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds, orderbys));} public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);} - public Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr; - public void Env_db_attach(String alias, Io_url db_url) {engine.Env_db_attach(alias, db_url);} - public void Env_db_detach(String alias) {engine.Env_db_detach(alias);} - public void Env_vacuum() {Exec_sql_plog_ntx("vacuuming: url=" + this.Conn_info().Xto_api(), "VACUUM;");} - public void Ddl_create_tbl(Dbmeta_tbl_itm meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs().To_ary());} - public void Ddl_create_idx(Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);} - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} - public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {engine.Ddl_append_fld(tbl, fld);} - public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);} - public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);} - public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);} - public Dbmeta_tbl_mgr Meta_tbl_load_all() {return engine.Meta_tbl_load_all();} + public Db_stmt Stmt_sql(String sql) {return engine.New_stmt_prep(Db_qry_sql.sql_(sql));} + public int Exec_qry(Db_qry qry) {return Int_.cast(engine.Exec_as_obj(qry));} + public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));} + public int Exec_sql(String msg, String sql) {Gfo_usr_dlg_.Instance.Plog_many("", "", msg); return this.Exec_sql(sql);} + public Db_rdr Exec_rdr(String sql) {return this.Stmt_sql(sql).Exec_select__rls_auto();} + public void Exec_delete_all(String tbl) {Stmt_delete(tbl).Exec_delete();} + public int Exec_sql_args(String sql, Object... args) {return this.Exec_qry(Db_qry_sql.dml_(String_.Format(sql, args)));} + public int Exec_sql_fmt_by_keys(String sql, String[] keys, Object... args) {return Exec_sql(exec_sql_fmt.Fmt_(sql).Keys_(Bry_.Ary(keys)).Bld_many_to_str(exec_sql_bfr, args));} + public int Exec_sql_plog_ntx(String msg, String sql) {return Exec_sql_plog(Bool_.N, msg, sql);} + public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);} + public int Exec_sql_plog(boolean txn, String msg, String sql) { + Gfo_usr_dlg_.Instance.Plog_many("", "", msg); + if (txn) this.Txn_bgn(msg); + int rv = Exec_sql(sql); + if (txn) this.Txn_end(); + Gfo_usr_dlg_.Instance.Plog_many("", "", "done:" + msg); + return rv; + } + public int Exec_select_as_int (String sql, int or) {Object rv = Exec_select_as_obj(sql); return rv == null ? or : Int_.cast(rv);} + public double Exec_select_as_double (String sql, double or) {Object rv = Exec_select_as_obj(sql); return rv == null ? or : Double_.cast(rv);} + private Object Exec_select_as_obj(String sql) { + Db_rdr rdr = Exec_rdr(sql); + try {return rdr.Move_next() ? rdr.Read_at(0) : null;} + finally {rdr.Rls();} + } public void Rls_reg(Rls_able rls) {rls_list.Add(rls);} public void Rls_conn() { int len = rls_list.Count(); @@ -66,21 +91,12 @@ public class Db_conn { engine.Conn_term(); Db_conn_pool.Instance.Del(engine.Conn_info()); } - public void Exec_delete_all(String tbl) {Stmt_delete(tbl).Exec_delete();} - public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));} - public Db_rdr Exec_sql_as_rdr_v2(String sql) {return this.Stmt_new(Db_qry_sql.dml_(sql)).Exec_select__rls_auto();} - public int Exec_sql_plog_ntx(String msg, String sql) {return Exec_sql_plog(Bool_.N, msg, sql);} - public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);} - public int Exec_sql_plog(boolean txn, String msg, String sql) { - Gfo_usr_dlg_.Instance.Plog_many("", "", msg); - if (txn) this.Txn_bgn(msg); - int rv = Exec_sql(sql); - if (txn) this.Txn_end(); - Gfo_usr_dlg_.Instance.Plog_many("", "", "done:" + msg); - return rv; + + public Db_stmt Stmt_select_max(String tbl, String col, String... where) { + Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl, String_.Ary(String_.Format("Max({0}) AS {0}", col)), where, null, null, null, null); + return engine.New_stmt_prep(qry); } - public int Exec_qry(Db_qry qry) {return Int_.cast(engine.Exec_as_obj(qry));} - public int Exec_sql_args(String sql, Object... args) {return this.Exec_qry(Db_qry_sql.dml_(String_.Format(sql, args)));} + public DataRdr Exec_sql_as_old_rdr(String sql) {return DataRdr_.cast(engine.Exec_as_obj(Db_qry_sql.rdr_(sql)));} public DataRdr Exec_qry_as_old_rdr(Db_qry qry) {return DataRdr_.cast(engine.Exec_as_obj(qry));} } diff --git a/140_dbs/src/gplx/dbs/Db_conn_.java b/140_dbs/src/gplx/dbs/Db_conn_.java index ebf1bd4bd..63059a818 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_.java +++ b/140_dbs/src/gplx/dbs/Db_conn_.java @@ -16,24 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -import gplx.core.stores.*; -import gplx.dbs.qrys.*; public class Db_conn_ { public static final Db_conn Noop = Db_conn_pool.Instance.Get_or_new(Db_conn_info_.Null); - public static int Select_fld0_as_int_or(Db_conn conn, String sql, int or) { - DataRdr rdr = DataRdr_.Null; - try { - rdr = conn.Exec_qry_as_old_rdr(Db_qry_sql.rdr_(sql)); - int rv = or; - if (rdr.MoveNextPeer()) { - Object rv_obj = rdr.ReadAt(0); - if (rv_obj != null) // Max(fil_id) will be NULL if tbl is empty - rv = Int_.cast_or(rv_obj, or); - } - return rv; - } - finally { - rdr.Rls(); - } - } } diff --git a/140_dbs/src/gplx/dbs/Db_conn_info.java b/140_dbs/src/gplx/dbs/Db_conn_info.java index 760975fdd..60ac509ce 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_info.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public interface Db_conn_info { - String Tid(); - String Database(); - String Xto_raw(); - String Xto_api(); - Db_conn_info New_self(String raw, GfoMsg m); + String Key(); // EX: "sqlite" + String Raw(); // EX: "gplx_key=sqlite;data source=/db.sqlite3;version=3" + String Db_api(); // EX: "data source=/db.sqlite3;version=3" + String Database(); // EX: /db.sqlite3 -> "db" ; xowa -> "xowa" + Db_conn_info New_self(String raw, Keyval_hash hash); } diff --git a/140_dbs/src/gplx/dbs/Db_conn_info_.java b/140_dbs/src/gplx/dbs/Db_conn_info_.java index ed7201676..87cd7d452 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_info_.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info_.java @@ -24,19 +24,24 @@ public class Db_conn_info_ { public static Db_conn_info parse(String raw) {return Db_conn_info_pool.Instance.Parse(raw);} public static Db_conn_info sqlite_(Io_url url) {return Sqlite_conn_info.load_(url);} public static Db_conn_info tdb_(Io_url url) {return Tdb_conn_info.new_(url);} - public static Db_conn_info mem_(String db) {return Db_conn_info__mem.new_(db);} + public static Db_conn_info mem_(String db) {return Mem_conn_info.new_(db);} public static final String Key_tdb = Tdb_conn_info.Tid_const; + public static Io_url To_url(Db_conn_info cs) { + if (String_.Eq(cs.Key(), Sqlite_conn_info.Key_const)) return ((Sqlite_conn_info)cs).Url(); + else if (String_.Eq(cs.Key(), Mem_conn_info.Instance.Key())) return Io_url_.mem_fil_("mem/" + ((Mem_conn_info)cs).Database()); + else throw Err_.new_unhandled_default(cs.Key()); + } } class Db_conn_info_pool { - private Ordered_hash regy = Ordered_hash_.New(); + private final Ordered_hash regy = Ordered_hash_.New(); public Db_conn_info_pool() { this.Add(Noop_conn_info.Instance).Add(Tdb_conn_info.Instance).Add(Mysql_conn_info.Instance).Add(Postgres_conn_info.Instance).Add(Sqlite_conn_info.Instance); - this.Add(Db_conn_info__mem.Instance); + this.Add(Mem_conn_info.Instance); } - public Db_conn_info_pool Add(Db_conn_info itm) {regy.Add_if_dupe_use_nth(itm.Tid(), itm); return this;} + public Db_conn_info_pool Add(Db_conn_info itm) {regy.Add_if_dupe_use_nth(itm.Key(), itm); return this;} public Db_conn_info Parse(String raw) {// assume each pair has format of: name=val; try { - GfoMsg m = GfoMsg_.new_parse_("db_url"); + Keyval_hash hash = new Keyval_hash(); String[] terms = String_.Split(raw, ";"); String url_tid = ""; for (String term : terms) { @@ -45,15 +50,15 @@ class Db_conn_info_pool { if (String_.Eq(kv[0], "gplx_key")) url_tid = kv[1]; // NOTE: do not add to GfoMsg; will not be part of ApiStr else - m.Add(kv[0], kv[1]); + hash.Add(kv[0], kv[1]); } Db_conn_info prototype = (Db_conn_info)regy.Get_by(url_tid); - return prototype.New_self(raw, m); + return prototype.New_self(raw, hash); } catch(Exception exc) {throw Err_.new_parse_exc(exc, Db_conn_info.class, raw);} } public Db_conn_info Parse_or_sqlite_or_fail(String raw) {// assume each pair has format of: name=val; - GfoMsg msg = GfoMsg_.new_parse_("db_url"); + Keyval_hash hash = new Keyval_hash(); String[] kvps = String_.Split(raw, ";"); String cs_tid = null; int kvps_len = kvps.length; @@ -65,19 +70,19 @@ class Db_conn_info_pool { if (String_.Eq(key, "gplx_key")) cs_tid = val; // NOTE: do not add to GfoMsg; will not be part of ApiStr else - msg.Add(key, val); + hash.Add(key, val); } if (cs_tid == null) { // gplx_key not found; try url as sqlite; EX: "/db.sqlite" Io_url sqlite_url = null; try {sqlite_url = Io_url_.new_any_(raw);} catch (Exception exc) {throw Err_.new_exc(exc, "dbs", "invalid connection String", "raw", raw);} - msg.Clear(); - cs_tid = Sqlite_conn_info.Tid_const; - msg.Add(Sqlite_conn_info.Cs__data_source, sqlite_url.Raw()); - msg.Add(Sqlite_conn_info.Cs__version , Sqlite_conn_info.Cs__version__3); + hash.Clear(); + cs_tid = Sqlite_conn_info.Key_const; + hash.Add(Sqlite_conn_info.Cs__data_source, sqlite_url.Raw()); + hash.Add(Sqlite_conn_info.Cs__version , Sqlite_conn_info.Cs__version__3); } Db_conn_info prototype = (Db_conn_info)regy.Get_by(cs_tid); - return prototype.New_self(raw, msg); + return prototype.New_self(raw, hash); } public static final Db_conn_info_pool Instance = new Db_conn_info_pool(); } diff --git a/140_dbs/src/gplx/dbs/Db_conn_info__base.java b/140_dbs/src/gplx/dbs/Db_conn_info__base.java index 93a09e229..ac7d0022f 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_info__base.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info__base.java @@ -16,30 +16,15 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -import gplx.core.strings.*; public abstract class Db_conn_info__base implements Db_conn_info { - public abstract String Tid(); - public String Xto_raw() {return raw;} private String raw = ""; - public String Xto_api() {return api;} private String api = ""; - public String Database() {return database;} protected String database = ""; - public String Server() {return server;} private String server = ""; - public abstract Db_conn_info New_self(String raw, GfoMsg m); - protected void Ctor(String server, String database, String raw, String api) {this.server = server; this.database = database; this.raw = raw; this.api = api;} - protected static String BldApi(GfoMsg m, KeyVal... xtnAry) { - String_bldr sb = String_bldr_.new_(); - Hash_adp hash = Hash_adp_.new_(); - for (int i = 0; i < m.Args_count(); i++) { - KeyVal kv = m.Args_getAt(i); - sb.Add_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty()); - hash.Add_as_key_and_val(kv.Key()); - } - for (KeyVal xtn : xtnAry) { - if (hash.Has(xtn.Key())) continue; - sb.Add_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty()); - } - return sb.To_str(); - } - protected static String Bld_raw(String... ary) { + public Db_conn_info__base(String raw, String db_api, String database) {this.raw = raw; this.db_api = db_api; this.database = database;} + public abstract String Key(); + public String Raw() {return raw;} private final String raw; + public String Db_api() {return db_api;} private final String db_api; + public String Database() {return database;} protected final String database; + public abstract Db_conn_info New_self(String raw, Keyval_hash hash); + + protected static String Bld_raw(String... ary) {// "a", "b" -> "a=b;" Bry_bfr bfr = Bry_bfr.reset_(255); int len = ary.length; for (int i = 0; i < len; ++i) { @@ -47,6 +32,19 @@ public abstract class Db_conn_info__base implements Db_conn_info { bfr.Add_str_u8(itm); bfr.Add_byte(i % 2 == 0 ? Byte_ascii.Eq : Byte_ascii.Semic); } - return bfr.To_str(); + return bfr.To_str_and_clear(); + } + protected static String Bld_api(Keyval_hash hash, Keyval... xtn_ary) { + Bry_bfr bfr = Bry_bfr.new_(); + int len = hash.Count(); + for (int i = 0; i < len; ++i) { + Keyval kv = hash.Get_at(i); + bfr.Add_str_u8_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty()); + } + for (Keyval xtn : xtn_ary) { + if (hash.Has(xtn.Key())) continue; + bfr.Add_str_u8_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty()); + } + return bfr.To_str_and_clear(); } } diff --git a/140_dbs/src/gplx/dbs/Db_conn_info_tst.java b/140_dbs/src/gplx/dbs/Db_conn_info_tst.java index 2252a0405..81b19b794 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_info_tst.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info_tst.java @@ -26,21 +26,23 @@ public class Db_conn_info_tst { tst_Parse("gplx_key=mock;id=1;name=me;", kv_("id", "1"), kv_("name", "me")); // many tst_Parse("gplx_key=mock;id=1;name=me" , kv_("id", "1"), kv_("name", "me")); // no semi-colon at end } - private KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);} - private void tst_Parse(String raw, KeyVal... expd) { + private Keyval kv_(String key, Object val) {return Keyval_.new_(key, val);} + private void tst_Parse(String raw, Keyval... expd) { Db_conn_info_mock mock = (Db_conn_info_mock)regy.Parse(raw); Tfds.Eq_ary_str(expd, mock.Kvs()); } } class Db_conn_info_mock extends Db_conn_info__base { - public KeyVal[] Kvs() {return kvs;} KeyVal[] kvs; - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mock"; - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Db_conn_info_mock rv = new Db_conn_info_mock(); - rv.kvs = new KeyVal[m.Args_count()]; - for (int i = 0; i < m.Args_count(); i++) - rv.kvs[i] = m.Args_getAt(i); + public Db_conn_info_mock(String raw, String db_api, String database) {super(raw, db_api, database);} + public Keyval[] Kvs() {return kvs;} Keyval[] kvs; + @Override public String Key() {return Tid_const;} public static final String Tid_const = "mock"; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + Db_conn_info_mock rv = new Db_conn_info_mock("", "", ""); + int len = hash.Count(); + rv.kvs = new Keyval[len]; + for (int i = 0; i < len; ++i) + rv.kvs[i] = hash.Get_at(i); return rv; } - public static final Db_conn_info_mock Instance = new Db_conn_info_mock(); Db_conn_info_mock() {} + public static final Db_conn_info_mock Instance = new Db_conn_info_mock("", "", ""); } diff --git a/140_dbs/src/gplx/dbs/Db_conn_pool.java b/140_dbs/src/gplx/dbs/Db_conn_pool.java index 97a4b0779..47a910306 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_pool.java +++ b/140_dbs/src/gplx/dbs/Db_conn_pool.java @@ -21,17 +21,17 @@ import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.mysql.*; import gplx.d public class Db_conn_pool { private final Hash_adp conn_hash = Hash_adp_.new_(); private final Hash_adp engine_hash = Hash_adp_.new_(); public void Clear() {conn_hash.Clear();} - public void Del(Db_conn_info url) {conn_hash.Del(url.Xto_api());} - public Db_conn Get_or_new__mem(String db) {return Get_or_new(Db_conn_info__mem.new_(db));} + public void Del(Db_conn_info url) {conn_hash.Del(url.Db_api());} + public Db_conn Get_or_new__mem(String db) {return Get_or_new(Mem_conn_info.new_(db));} public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_conn_info_.sqlite_(url));} public Db_conn Get_or_new(String s) {return Get_or_new(Db_conn_info_.parse(s));} public Db_conn Get_or_new(Db_conn_info url) { - Db_conn rv = (Db_conn)conn_hash.Get_by(url.Xto_api()); + Db_conn rv = (Db_conn)conn_hash.Get_by(url.Db_api()); if (rv == null) { - Db_engine prime = (Db_engine)engine_hash.Get_by(url.Tid()); if (prime == null) Err_.new_wo_type("db engine prototype not found", "tid", url.Tid()); + Db_engine prime = (Db_engine)engine_hash.Get_by(url.Key()); if (prime == null) Err_.new_wo_type("db engine prototype not found", "key", url.Key()); Db_engine clone = prime.New_clone(url); rv = new Db_conn(clone); - conn_hash.Add(url.Xto_api(), rv); + conn_hash.Add(url.Db_api(), rv); } return rv; } @@ -41,6 +41,6 @@ public class Db_conn_pool { } public static final Db_conn_pool Instance = new Db_conn_pool(); Db_conn_pool() {this.Init();} private void Init() { - this.Engines__add(Noop_engine.Instance, TdbEngine.Instance, Mysql_engine.Instance, Postgres_engine.Instance, Sqlite_engine.Instance, Db_engine__mem.Instance); + this.Engines__add(Noop_engine.Instance, TdbEngine.Instance, Mysql_engine.Instance, Postgres_engine.Instance, Sqlite_engine.Instance, Mem_engine.Instance); } } diff --git a/140_dbs/src/gplx/dbs/Db_conn_utl.java b/140_dbs/src/gplx/dbs/Db_conn_utl.java index 5a25b5272..2e94d311c 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_utl.java +++ b/140_dbs/src/gplx/dbs/Db_conn_utl.java @@ -22,11 +22,8 @@ public class Db_conn_utl { Db_conn_bldr.Instance.Reg_default_mem(); return Db_conn_bldr.Instance.Get_or_new(Io_url_.mem_fil_("mem/" + url_rel)).Conn(); } - public static void Tbl__delete(Db_conn conn, String tbl) { - conn.Ddl_delete_tbl(tbl); - } public static void Tbl__new(Db_conn conn, String tbl, Dbmeta_fld_itm[] flds, Object[]... rows) { - conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl, flds)); + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl, flds)); int rows_len = rows.length; Db_stmt stmt = conn.Stmt_insert(tbl, Dbmeta_fld_itm.To_str_ary(flds)); for (int i = 0; i < rows_len; ++i) { @@ -51,4 +48,30 @@ public class Db_conn_utl { stmt.Exec_insert(); } } + public static void Insert(Db_conn conn, String tbl_name, String[] flds, Object[]... rows) { + Db_stmt stmt = Db_stmt_.new_insert_(conn, tbl_name, flds); + int flds_len = flds.length; + int rows_len = rows.length; + for (int i = 0; i < rows_len; ++i) { + Object[] row = rows[i]; + stmt.Clear(); + for (int j = 0; j < flds_len; ++j) + Db_stmt_.Val_by_obj(stmt, flds[j], row[j]); + stmt.Exec_insert(); + } + } + public static Object[][] Select(Db_conn conn, Db_qry qry) { + List_adp rv = List_adp_.new_(); + Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + int fld_len = rdr.Fld_len(); + Object[] row = new Object[fld_len]; + for (int i = 0; i < fld_len; ++i) + row[i] = rdr.Read_at(i); + rv.Add(row); + } + } finally {rdr.Rls();} + return (Object[][])rv.To_ary_and_clear(Object[].class); + } } diff --git a/140_dbs/src/gplx/dbs/Db_crt_.java b/140_dbs/src/gplx/dbs/Db_crt_.java index 05d9ece5a..d7a343314 100644 --- a/140_dbs/src/gplx/dbs/Db_crt_.java +++ b/140_dbs/src/gplx/dbs/Db_crt_.java @@ -19,6 +19,7 @@ package gplx.dbs; import gplx.*; import gplx.core.criterias.*; public class Db_crt_ { public static final Criteria Wildcard = Criteria_.All; + public static Criteria New_and (Criteria lhs, Criteria rhs) {return Criteria_.And(lhs, rhs);} public static Criteria_fld New_eq (String key, Object val) {return Criteria_fld.new_(key, Criteria_.eq_(val));} public static Criteria_fld New_eq (String pre, String key, Object val) {return Criteria_fld.new_(pre, key, Criteria_.eq_(val));} public static Criteria_fld New_eq_not (String key, Object val) {return Criteria_fld.new_(key, Criteria_.eqn_(val));} @@ -51,10 +52,10 @@ public class Db_crt_ { } return rv; } - public static Criteria eq_many_(KeyVal... array) { + public static Criteria eq_many_(Keyval... array) { Criteria rv = null; for (int i = 0; i < array.length; i++) { - KeyVal pair = array[i]; + Keyval pair = array[i]; Criteria crt = Db_crt_.New_eq(pair.Key(), pair.Val()); rv = (i == 0)? crt : Criteria_.And(rv, crt); } diff --git a/140_dbs/src/gplx/dbs/Db_null.java b/140_dbs/src/gplx/dbs/Db_null.java new file mode 100644 index 000000000..7cf847ded --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_null.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.dbs; import gplx.*; +public class Db_null implements gplx.core.brys.Bfr_arg { + public void Bfr_arg__add(Bry_bfr bfr) {bfr.Add_str_a7(Null_str);} + @Override public String toString() {return Null_str;} + public static final String Null_str = "NULL"; + public static final Db_null Instance = new Db_null(); Db_null() {} +} diff --git a/140_dbs/src/gplx/dbs/Db_qry_.java b/140_dbs/src/gplx/dbs/Db_qry_.java index 4b8ea65d7..c75ad3f44 100644 --- a/140_dbs/src/gplx/dbs/Db_qry_.java +++ b/140_dbs/src/gplx/dbs/Db_qry_.java @@ -20,21 +20,21 @@ import gplx.core.criterias.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; im public class Db_qry_ { public static Db_qry__select_cmd select_cols_(String tbl, Criteria crt, String... cols){return select_().From_(tbl).Where_(crt).Cols_(cols);} public static Db_qry__select_cmd select_val_(String tbl, String col, Criteria crt) {return select_().From_(tbl).Where_(crt).Cols_(col);} - public static Db_qry__select_cmd select_tbl_(String tbl) {return select_().From_(tbl);} + public static Db_qry__select_cmd select_tbl_(String tbl) {return select_().From_(tbl).Cols_all_();} public static Db_qry__select_cmd select_() {return new Db_qry__select_cmd();} public static Db_qry__select_cmd select_(String tbl, String... cols) {return new Db_qry__select_cmd().From_(tbl).Cols_(cols);} public static Db_qry_delete delete_(String tbl, Criteria crt) {return Db_qry_delete.new_(tbl, crt);} public static Db_qry_delete delete_tbl_(String tbl) {return Db_qry_delete.new_(tbl);} public static Db_qry_insert insert_(String tbl) {return new Db_qry_insert(tbl);} - public static Db_qry_insert insert_common_(String tbl, KeyVal... pairs) { + public static Db_qry_insert insert_common_(String tbl, Keyval... pairs) { Db_qry_insert cmd = new Db_qry_insert(tbl); - for (KeyVal pair : pairs) + for (Keyval pair : pairs) cmd.Val_obj(pair.Key(), pair.Val()); return cmd; } - public static Sql_join_itm New_join__join(String trg_fld, String src_tbl, String src_fld) {return new Sql_join_itm(trg_fld, src_tbl, src_fld);} - public static Sql_join_itm New_join__same(String tbl, String fld) {return new Sql_join_itm(fld, tbl, fld);} + public static Sql_join_fld New_join__join(String trg_fld, String src_tbl, String src_fld) {return new Sql_join_fld(trg_fld, src_tbl, src_fld);} + public static Sql_join_fld New_join__same(String tbl, String fld) {return new Sql_join_fld(fld, tbl, fld);} public static Db_qry_update update_(String tbl, Criteria crt) { Db_qry_update update = new Db_qry_update(); @@ -42,10 +42,10 @@ public class Db_qry_ { update.Where_(crt); return update; } - public static Db_qry_update update_common_(String tbl, Criteria crt, KeyVal... pairs) { + public static Db_qry_update update_common_(String tbl, Criteria crt, Keyval... pairs) { Db_qry_update cmd = new Db_qry_update(); cmd.From_(tbl); cmd.Where_(crt); - for (KeyVal pair : pairs) + for (Keyval pair : pairs) cmd.Val_obj(pair.Key(), pair.Val()); return cmd; } diff --git a/140_dbs/src/gplx/dbs/Db_qry_fxt.java b/140_dbs/src/gplx/dbs/Db_qry_fxt.java index fe4e68899..6c2b2b8ad 100644 --- a/140_dbs/src/gplx/dbs/Db_qry_fxt.java +++ b/140_dbs/src/gplx/dbs/Db_qry_fxt.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import gplx.dbs.qrys.*; import gplx.core.gfo_ndes.*; public class Db_qry_fxt { - public static void Insert_kvo(Db_conn conn, String tblName, KeyValList kvList) { + public static void Insert_kvo(Db_conn conn, String tblName, Keyval_list kvList) { Db_qry_insert qry = Db_qry_.insert_(tblName); for (int i = 0; i < kvList.Count(); i++) { - KeyVal kv = kvList.GetAt(i); + Keyval kv = kvList.Get_at(i); qry.Val_obj(kv.Key(), kv.Val()); } qry.Exec_qry(conn); @@ -52,4 +52,16 @@ public class Db_qry_fxt { } } } + public static String Db__print_tbl_as_str(Bry_bfr bfr, Db_conn conn, String tbl, String... cols) { + int cols_len = cols.length; + Db_rdr rdr = conn.Stmt_select(tbl, cols).Exec_select__rls_auto(); + while (rdr.Move_next()) { + for (int i = 0; i < cols_len; ++i) { + bfr.Add_obj(rdr.Read_at(i)); + bfr.Add_byte(i == cols_len - 1 ? Byte_ascii.Nl : Byte_ascii.Pipe); + } + } + rdr.Rls(); + return bfr.To_str_and_clear(); + } } diff --git a/140_dbs/src/gplx/dbs/Db_rdr.java b/140_dbs/src/gplx/dbs/Db_rdr.java index bcb146a0f..16757285b 100644 --- a/140_dbs/src/gplx/dbs/Db_rdr.java +++ b/140_dbs/src/gplx/dbs/Db_rdr.java @@ -29,6 +29,7 @@ public interface Db_rdr { double Read_double(String k); DateAdp Read_date_by_str(String k); boolean Read_bool_by_byte(String k); + int Fld_len(); Object Read_obj(String k); Object Read_at(int i); void Rls(); diff --git a/140_dbs/src/gplx/dbs/Db_rdr_.java b/140_dbs/src/gplx/dbs/Db_rdr_.java index 426d71af8..f1d5b8c3f 100644 --- a/140_dbs/src/gplx/dbs/Db_rdr_.java +++ b/140_dbs/src/gplx/dbs/Db_rdr_.java @@ -32,6 +32,7 @@ class Db_rdr__empty implements Db_rdr { public float Read_float(String k) {return Float_.NaN;} public double Read_double(String k) {return Double_.NaN;} public boolean Read_bool_by_byte(String k) {return false;} + public int Fld_len() {return 0;} public Object Read_obj(String k) {return null;} public Object Read_at(int i) {return null;} public void Rls() {} diff --git a/140_dbs/src/gplx/dbs/Db_rdr__basic.java b/140_dbs/src/gplx/dbs/Db_rdr__basic.java index 7487121b0..699c76c8e 100644 --- a/140_dbs/src/gplx/dbs/Db_rdr__basic.java +++ b/140_dbs/src/gplx/dbs/Db_rdr__basic.java @@ -37,8 +37,9 @@ public class Db_rdr__basic implements Db_rdr { @gplx.Virtual public double Read_double(String k) {try {return Double_.cast(rdr.getObject(k));} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Double_.Cls_val_name);}} @gplx.Virtual public byte Read_byte(String k) {try {return Byte_.cast(rdr.getObject(k));} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Byte_.Cls_val_name);}} @gplx.Virtual public boolean Read_bool_by_byte(String k) {try {return Byte_.cast(rdr.getObject(k)) == 1;} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Bool_.Cls_val_name);}} + @gplx.Virtual public int Fld_len() {try {return rdr.getMetaData().getColumnCount();} catch (Exception e) {throw Err_.new_exc(e, "db", "field count failed", "sql", sql);}} @gplx.Virtual public Object Read_obj(String k) {try {return rdr.getObject(k);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Object_.Cls_val_name);}} - @gplx.Virtual public Object Read_at(int i) {try {return rdr.getObject(i);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "idx", i, "type", Object_.Cls_val_name);}} + @gplx.Virtual public Object Read_at(int i) {try {return rdr.getObject(i + 1);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "idx", i, "type", Object_.Cls_val_name);}} @gplx.Virtual public void Rls() { try {rdr.close();} catch (Exception e) {throw Err_.new_exc(e, "db", "close failed");} diff --git a/140_dbs/src/gplx/dbs/Db_stmt_.java b/140_dbs/src/gplx/dbs/Db_stmt_.java index ba6f18fda..3a7dc528a 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt_.java +++ b/140_dbs/src/gplx/dbs/Db_stmt_.java @@ -55,4 +55,18 @@ public class Db_stmt_ { throw Err_.new_exc(e, "core", "db call failed", "tbl", tbl, "proc", proc); } public static Db_stmt Rls(Db_stmt v) {if (v != null) v.Rls(); return null;} + public static void Val_by_obj(Db_stmt stmt, String key, Object val) { + int tid = Type_adp_.To_tid_obj(val); + switch (tid) { + case Type_adp_.Tid__bool: stmt.Val_bool_as_byte (key, Bool_.cast(val)); break; + case Type_adp_.Tid__byte: stmt.Val_byte (key, Byte_.cast(val)); break; + case Type_adp_.Tid__int: stmt.Val_int (key, Int_.cast(val)); break; + case Type_adp_.Tid__long: stmt.Val_long (key, Long_.cast(val)); break; + case Type_adp_.Tid__float: stmt.Val_float (key, Float_.cast(val)); break; + case Type_adp_.Tid__double: stmt.Val_double (key, Double_.cast(val)); break; + case Type_adp_.Tid__str: stmt.Val_str (key, String_.cast(val)); break; + case Type_adp_.Tid__bry: stmt.Val_bry (key, Bry_.cast(val)); break; + default: throw Err_.new_unhandled_default(tid); + } + } } diff --git a/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java b/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java index c47f6397d..76f9075da 100644 --- a/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java +++ b/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java @@ -61,4 +61,21 @@ public class Dbmeta_fld_itm { rv[i] = ary[i].name; return rv; } + + public static String Make_or_null(Db_conn conn, Dbmeta_fld_list flds, String tbl_name, int fld_type, Object fld_dflt, String fld_name) { + boolean tbl_exists = conn.Meta_tbl_exists(tbl_name); + boolean fld_exists = true; + if (tbl_exists) { + fld_exists = conn.Meta_fld_exists(tbl_name, fld_name); + if (!fld_exists) return Dbmeta_fld_itm.Key_null; + } + Dbmeta_fld_itm fld = null; + switch (fld_type) { + case Dbmeta_fld_tid.Tid__int: fld = Dbmeta_fld_itm.new_int(fld_name); break; + } + if (fld_dflt != null) fld.Default_(fld_dflt); + flds.Add(fld); + return fld.name; + } + public static String To_double_str_by_int(int v) {return Int_.To_str(v) + ".0";} } diff --git a/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java b/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java index ed3c8dd6c..c0fa2227b 100644 --- a/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java +++ b/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java @@ -20,9 +20,10 @@ public class Dbmeta_fld_list { private final Ordered_hash flds = Ordered_hash_.New(); private final List_adp keys = List_adp_.new_(); public void Clear() {flds.Clear(); keys.Clear(); str_ary = null; fld_ary = null;} + public int Len() {return flds.Len();} public Dbmeta_fld_itm Get_by(String name) {return (Dbmeta_fld_itm)flds.Get_by(name);} public Dbmeta_fld_itm Get_at(int idx) {return (Dbmeta_fld_itm)flds.Get_at(idx);} - public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary; + public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary; public Dbmeta_fld_itm[] To_fld_ary() {if (fld_ary == null) fld_ary = (Dbmeta_fld_itm[])flds.To_ary(Dbmeta_fld_itm.class); return fld_ary;} private Dbmeta_fld_itm[] fld_ary; public String[] To_str_ary_wo_autonum() { int len = flds.Count(); @@ -72,6 +73,7 @@ public class Dbmeta_fld_list { public String Add_str_dflt(String name, int len, String dflt) {return Add(Dbmeta_fld_itm.new_str(name, len).Default_(dflt));} public String Add(Dbmeta_fld_itm fld) { + fld_ary = null; str_ary = null; String name = fld.Name(); flds.Add(name, fld); keys.Add(name); diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java b/140_dbs/src/gplx/dbs/Dbmeta_fld_tid.java similarity index 95% rename from 140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java rename to 140_dbs/src/gplx/dbs/Dbmeta_fld_tid.java index 86796d484..a9928fb60 100644 --- a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java +++ b/140_dbs/src/gplx/dbs/Dbmeta_fld_tid.java @@ -15,8 +15,8 @@ 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.dbs.metas; import gplx.*; import gplx.dbs.*; -import gplx.dbs.engines.sqlite.*; +package gplx.dbs; import gplx.*; +import gplx.dbs.engines.sqlite.*; // for Tid_sqlite; note that Tid_sqlite is not used, and only exists for doc purposes public class Dbmeta_fld_tid { public Dbmeta_fld_tid(int tid_ansi, int tid_sqlite, byte[] name, int len_1, int len_2) { this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; this.name = name; this.len_1 = len_1; this.len_2 = len_2; diff --git a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java index aebb9d38f..b347423fd 100644 --- a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java @@ -72,8 +72,8 @@ class Gfdb_diff_bldr_fxt { } public void Clear() { ctx.Clear(); - Db_conn_utl.Tbl__delete(old_conn, "tbl"); - Db_conn_utl.Tbl__delete(new_conn, "tbl"); + old_conn.Meta_tbl_drop("tbl"); + new_conn.Meta_tbl_drop("tbl"); } public void Init__tbl__old(Object[]... rows) {Db_conn_utl.Tbl__new(old_conn, "tbl", flds_ary, rows);} public void Init__tbl__cur(Object[]... rows) {Db_conn_utl.Tbl__new(new_conn, "tbl", flds_ary, rows);} diff --git a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java index 8a6fd5ec6..57fb054b0 100644 --- a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java @@ -31,7 +31,7 @@ public class Gfdb_diff_wkr__db implements Gfdb_diff_wkr { this.uid = 0; this.prog_count = 0; String dif_tbl = tbl.Name; Dbmeta_fld_itm[] dif_flds = Gfdb_diff_wkr__db_.New_dif_flds(tbl.Flds); - if (!dif_conn.Meta_tbl_exists(dif_tbl)) dif_conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(dif_tbl, dif_flds)); + if (!dif_conn.Meta_tbl_exists(dif_tbl)) dif_conn.Meta_tbl_create(Dbmeta_tbl_itm.New(dif_tbl, dif_flds)); this.stmt = dif_conn.Stmt_insert(dif_tbl, Gfdb_diff_wkr__db_.To_str_ary(dif_flds)); dif_conn.Txn_bgn("dif_db_tbl_" + dif_tbl); cmd_create = true; diff --git a/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java index f4b795536..06d6cc2fc 100644 --- a/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java +++ b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java @@ -45,7 +45,7 @@ class Gfdb_diff_cmd__idx__create implements Gfo_srl_itm { rdr.Itm_end(); } public void Exec(Db_conn conn) { - conn.Ddl_create_idx(cur); + conn.Meta_idx_create(cur); } } class Gfdb_diff_cmd__idx__fld implements Gfo_srl_itm { diff --git a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_cmd_tbl.java b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_cmd_tbl.java index e824e6a47..4ace12a67 100644 --- a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_cmd_tbl.java +++ b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_cmd_tbl.java @@ -26,7 +26,7 @@ public class Gdif_cmd_tbl implements Rls_able { fld_grp_id = flds.Add_int("grp_id"); fld_cmd_id = flds.Add_int("cmd_id"); fld_tid = flds.Add_int("tid"); fld_data = flds.Add_text("data"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp_id, fld_cmd_id)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp_id, fld_cmd_id)));} public Gdif_cmd_itm Insert(int grp_id, int cmd_id, int tid, String data) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_job_tbl.java b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_job_tbl.java index 137638b2d..9882d530d 100644 --- a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_job_tbl.java +++ b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_job_tbl.java @@ -28,7 +28,7 @@ public class Gdif_job_tbl implements Rls_able { } public String Tbl_name() {return tbl_name;} public String Fld_job_id() {return fld_job_id;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public Gdif_job_itm Insert(int id, String name, String made_by, DateAdp made_on, String data) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_txn_tbl.java b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_txn_tbl.java index e19fffb98..2c656d6df 100644 --- a/140_dbs/src/gplx/dbs/diffs/itms/Gdif_txn_tbl.java +++ b/140_dbs/src/gplx/dbs/diffs/itms/Gdif_txn_tbl.java @@ -26,7 +26,7 @@ public class Gdif_txn_tbl implements Rls_able { fld_job_id = flds.Add_int("job_id"); fld_txn_id = flds.Add_int("txn_id"); fld_cmd_id = flds.Add_int("cmd_id"); fld_owner_txn = flds.Add_int("owner_txn"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_job_id, fld_txn_id)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_job_id, fld_txn_id)));} public Gdif_txn_itm Insert(int job_id, int txn_id, int cmd_id, int owner_txn) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine.java b/140_dbs/src/gplx/dbs/engines/Db_engine.java index f48770a4a..af048d621 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine.java @@ -38,8 +38,10 @@ public interface Db_engine { void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary); void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld); void Ddl_delete_tbl(String tbl); + void Env_db_attach(String alias, Db_conn conn); void Env_db_attach(String alias, Io_url db_url); void Env_db_detach(String alias); + void Meta_reload(); boolean Meta_tbl_exists(String tbl); boolean Meta_fld_exists(String tbl, String fld); Dbmeta_tbl_mgr Meta_tbl_load_all(); diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java index 4de33ecbc..7ab5c0233 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java @@ -46,7 +46,7 @@ public abstract class Db_engine_sql_base implements Db_engine { Statement cmd = New_stmt_exec(sql); return cmd.executeUpdate(sql); } - catch (Exception e) {throw Err_.new_exc(e, "db", "db.engine:exec failed", "url", conn_info.Xto_api(), "sql", sql);} + catch (Exception e) {throw Err_.new_exc(e, "db", "db.engine:exec failed", "url", conn_info.Db_api(), "sql", sql);} } private DataRdr Exec_as_rdr(String sql) { try { @@ -55,16 +55,17 @@ public abstract class Db_engine_sql_base implements Db_engine { ResultSet rdr = cmd.getResultSet(); return New_rdr(rdr, sql); } - catch (Exception e) {throw Err_.new_exc(e, "db", "db.engine:rdr failed", "url", conn_info.Xto_api(), "sql", sql);} + catch (Exception e) {throw Err_.new_exc(e, "db", "db.engine:rdr failed", "url", conn_info.Db_api(), "sql", sql);} } - public void Ddl_create_tbl(Dbmeta_tbl_itm tbl) {Exec_as_int(tbl.To_sql_create(this.Sql_wtr()));} + public void Ddl_create_tbl(Dbmeta_tbl_itm tbl) {Exec_as_int(tbl.To_sql_create(this.Sql_wtr())); this.Meta_reload();} public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) { int len = ary.length; for (int i = 0; i < len; ++i) { Dbmeta_idx_itm idx = ary[i]; - usr_dlg.Plog_many("", "", "creating database index (please wait); db=~{0} idx=~{1}", conn_info.Database(), idx.Name()); + usr_dlg.Plog_many("", "", "creating db index (please wait); db=~{0} idx=~{1}", conn_info.Database(), idx.Name()); Exec_as_int(idx.To_sql_create(Sql_wtr())); } + this.Meta_reload(); } public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) { Gfo_usr_dlg_.Instance.Plog_many("", "", "adding column to table: db=~{0} tbl=~{1} fld=~{2}", conn_info.Database(), tbl, fld.Name()); @@ -75,10 +76,13 @@ public abstract class Db_engine_sql_base implements Db_engine { catch (Exception e) { // catch error if column already added to table Gfo_usr_dlg_.Instance.Warn_many("", "", "column not added to table: db=~{0} tbl=~{1} fld=~{2} err=~{3}", conn_info.Database(), tbl, fld.Name(), Err_.Message_gplx_full(e)); } + this.Meta_reload(); } - public void Ddl_delete_tbl(String tbl) {Exec_as_int(this.Sql_wtr().Schema_wtr().Bld_drop_tbl(tbl));} + public void Ddl_delete_tbl(String tbl) {Exec_as_int(this.Sql_wtr().Schema_wtr().Bld_drop_tbl(tbl)); this.Meta_reload();} @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} + @gplx.Virtual public void Env_db_attach(String alias, Db_conn db_url) {} @gplx.Virtual public void Env_db_detach(String alias) {} + @gplx.Virtual public void Meta_reload() {} @gplx.Virtual public boolean Meta_tbl_exists(String tbl) {return false;} @gplx.Virtual public boolean Meta_fld_exists(String tbl, String fld) {return false;} public abstract Dbmeta_tbl_mgr Meta_tbl_load_all(); @@ -94,7 +98,7 @@ public abstract class Db_engine_sql_base implements Db_engine { public void Conn_term() { if (connection == null) return; // connection never opened; just exit try {connection.close();} - catch (Exception e) {throw Err_.new_exc(e, "db", "Conn_term failed", "url", conn_info.Xto_raw());} + catch (Exception e) {throw Err_.new_exc(e, "db", "Conn_term failed", "url", conn_info.Raw());} connection = null; } public Object New_stmt_prep_as_obj(String sql) { @@ -109,6 +113,6 @@ public abstract class Db_engine_sql_base implements Db_engine { } protected Connection Conn_make_by_url(String url, String uid, String pwd) { try {return DriverManager.getConnection(url, uid, pwd);} - catch (SQLException e) {throw Err_.new_exc(e, "db", "connection open failed", "info", Conn_info().Xto_raw());} + catch (SQLException e) {throw Err_.new_exc(e, "db", "connection open failed", "info", Conn_info().Raw());} } } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_conn_info.java similarity index 68% rename from 140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java rename to 140_dbs/src/gplx/dbs/engines/mems/Mem_conn_info.java index 68e5b5a38..ef65f8205 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_conn_info.java @@ -16,12 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Db_conn_info__mem extends Db_conn_info__base { - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mem"; - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Db_conn_info__mem rv = new Db_conn_info__mem(); - rv.Ctor("", m.ReadStr("database"), raw, raw); - return rv; +public class Mem_conn_info extends Db_conn_info__base { + public Mem_conn_info(String raw, String db_api, String database) {super(raw, db_api, database);} + @Override public String Key() {return Tid_const;} public static final String Tid_const = "mem"; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + return new Mem_conn_info(raw, raw, hash.Get_val_as_str_or_fail("database")); } public static Db_conn_info new_(String database) { return Db_conn_info_.parse(Bld_raw @@ -29,5 +28,5 @@ public class Db_conn_info__mem extends Db_conn_info__base { , "database", database )); } - public static final Db_conn_info__mem Instance = new Db_conn_info__mem(); Db_conn_info__mem() {} + public static final Mem_conn_info Instance = new Mem_conn_info("", "", ""); } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_db_fxt.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_db_fxt.java new file mode 100644 index 000000000..6732716bd --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_db_fxt.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.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +class Mem_db_fxt { + public Mem_db_fxt() { + Io_mgr.Instance.InitEngine_mem(); + Db_conn_bldr.Instance.Reg_default_mem(); + } + public Db_conn Make_conn(String url) {return Db_conn_bldr.Instance.Get_or_autocreate(Bool_.Y, Io_url_.mem_fil_(url));} + public Dbmeta_tbl_itm Exec__create_tbl(Db_conn conn, String tbl, String... fld_names) { + Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); + int len = fld_names.length; + for (int i = 0; i < len; ++i) + flds.Add_str(fld_names[i], 255); + Dbmeta_tbl_itm rv = Dbmeta_tbl_itm.New(tbl, flds); + conn.Meta_tbl_create(rv); + return rv; + } + public void Exec__insert(Db_conn conn, String tbl_name, String[]... rows) { + Mem_engine engine = (Mem_engine)conn.Engine(); + int rows_len = rows.length; + Mem_tbl tbl = engine.Tbls__get(tbl_name); + Dbmeta_fld_list flds_list = tbl.Meta().Flds().To_fld_list(); + int flds_len = flds_list.Len(); + Db_stmt stmt = conn.Stmt_insert(tbl_name, flds_list); + for (int i = 0; i < rows_len; ++i) { + stmt.Clear(); + String[] row = rows[i]; + for (int j = 0; j < flds_len; ++j) + stmt.Val_str(flds_list.Get_at(j).Name(), row[j]); + stmt.Exec_insert(); + } + } + public void Test__select(Db_conn conn, Db_qry qry, String[]... expd) { + Db_stmt stmt = conn.Stmt_new(qry); + Db_rdr rdr = new Mem_exec_select((Mem_engine)conn.Engine()).Select((Mem_stmt)stmt); + List_adp actl_list = List_adp_.new_(); + Bry_bfr tmp_bfr = Bry_bfr.new_(); + int expd_len = expd.length; + String[] expd_rows = new String[expd_len]; + for (int i = 0; i < expd_len; ++i) { + String[] expd_row = expd[i]; + for (int j = 0; j < expd_row.length; ++j) { + if (j != 0) tmp_bfr.Add_byte_pipe(); + tmp_bfr.Add_str_u8(expd_row[j]); + } + expd_rows[i] = tmp_bfr.To_str_and_clear(); + } + while (rdr.Move_next()) { + int fld_len = rdr.Fld_len(); + for (int i = 0; i < fld_len; ++i) { + if (i != 0) tmp_bfr.Add_byte_pipe(); + tmp_bfr.Add_obj_strict(rdr.Read_at(i)); + } + actl_list.Add(tmp_bfr.To_str_and_clear()); + } + Tfds.Eq_ary(expd_rows, (String[])actl_list.To_ary_and_clear(String.class)); + } +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_engine.java similarity index 75% rename from 140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java rename to 140_dbs/src/gplx/dbs/engines/mems/Mem_engine.java index dfe2a58ba..5978fd2ee 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_engine.java @@ -17,15 +17,20 @@ along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; -public class Db_engine__mem implements Db_engine { +public class Mem_engine implements Db_engine { private final Hash_adp tbl_hash = Hash_adp_.new_(); - Db_engine__mem(Db_conn_info conn_info) {this.conn_info = conn_info;} - public String Tid() {return Db_conn_info__mem.Tid_const;} + Mem_engine(Db_conn_info conn_info) { + this.conn_info = conn_info; + this.qry_runner = new Mem_exec_select(this); + } + public String Tid() {return Mem_conn_info.Tid_const;} public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info; + public Mem_exec_select Qry_runner() {return qry_runner;} private Mem_exec_select qry_runner; public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.Basic; - public Db_engine New_clone(Db_conn_info conn_info) {return new Db_engine__mem(conn_info);} - public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt__mem(this, qry);} - public Mem_tbl Tbls_get(String name) {return (Mem_tbl)tbl_hash.Get_by(name);} + public Db_engine New_clone(Db_conn_info conn_info) {return new Mem_engine(conn_info);} + public Db_stmt New_stmt_prep(Db_qry qry) {return new Mem_stmt(this, qry);} + public Mem_tbl Tbls__get(String name) {return (Mem_tbl)tbl_hash.Get_by(name);} + public void Tbls__del(String name) {tbl_hash.Del(name);} public void Txn_bgn(String name) {++txn_count;} private int txn_count = 0; public String Txn_end() {--txn_count; return "";} public void Txn_cxl() {--txn_count;} @@ -46,14 +51,19 @@ public class Db_engine__mem implements Db_engine { } public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {} // TODO: implement unique index public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {} - public void Ddl_delete_tbl(String tbl) {} + public void Ddl_delete_tbl(String tbl_key) { + Mem_tbl tbl = (Mem_tbl)tbl_hash.Get_by(tbl_key); + if (tbl != null) tbl.rows.Clear(); + } + public void Env_db_attach(String alias, Db_conn conn) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} + public void Meta_reload() {} public boolean Meta_tbl_exists(String tbl) {return tbl_hash.Has(tbl);} public boolean Meta_fld_exists(String tbl, String fld) { Mem_tbl mem_tbl = (Mem_tbl)tbl_hash.Get_by(tbl); if (mem_tbl == null) return false; return mem_tbl.Meta().Flds().Has(fld); } public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); - public static final Db_engine__mem Instance = new Db_engine__mem(); Db_engine__mem() {} + public static final Mem_engine Instance = new Mem_engine(); Mem_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select.java new file mode 100644 index 000000000..94b84ecb5 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select.java @@ -0,0 +1,211 @@ +/* +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.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import gplx.core.criterias.*; +import gplx.dbs.qrys.*; import gplx.dbs.sqls.itms.*; +public class Mem_exec_select { + private final Mem_engine engine; + private final List_adp tmp_where_rows = List_adp_.new_(); + public Mem_exec_select(Mem_engine engine) {this.engine = engine;} + public Db_rdr Select(Mem_stmt stmt) { + Db_qry stmt_qry = stmt.Qry(); + Mem_tbl tbl = engine.Tbls__get(stmt_qry.Base_table()); + String[] select = null; Criteria where = null; + Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.as_(stmt_qry); + Db_qry__select_cmd qry2 = null; + if (qry == null) { + qry2 = (Db_qry__select_cmd)stmt_qry; + select = Mem_exec_.Flds__to_str_ary(qry2.Cols().Flds); + where = qry2.Where_itm().Root; + } + else { + select = qry.Select_flds(); + where = qry.Where(); + } + Mem_stmt_args_.Fill(stmt.Stmt_args(), where); + Mem_row[] tbl_rows = (Mem_row[])tbl.rows.To_ary(Mem_row.class); + if (qry2 != null) { + tbl_rows = Mem_exec_.Rows__alias(tbl_rows, qry2.From().Base_tbl.Alias); + List_adp join_tbls = qry2.From().Tbls; + int join_tbls_len = join_tbls.Len(); + for (int i = 1; i < join_tbls_len; ++i) { + Sql_tbl_itm join_tbl = (Sql_tbl_itm)join_tbls.Get_at(i); + Mem_row[] join_rows = (Mem_row[])engine.Tbls__get(join_tbl.Name).rows.To_ary(Mem_row.class); + join_rows = Mem_exec_.Rows__alias(join_rows, join_tbl.Alias); + tbl_rows = Mem_exec_.Rows__join(join_tbl.Join_tid, tbl_rows, join_rows, join_tbl.Alias, join_tbl.Join_flds); + } + } + Mem_exec_.Where__filter(tmp_where_rows, tbl_rows, stmt, where); + Mem_row[] rslt_rows = (Mem_row[])tmp_where_rows.To_ary_and_clear(Mem_row.class); + if (qry2 != null) { + if (qry2.Order() != null && qry2.Order().Flds().length > 0) + Array_.Sort(rslt_rows, new Mem_sorter(qry2.Order().Flds())); + int offset = qry2.Offset(); + if (offset != Db_qry__select_cmd.Offset__disabled) { + Mem_row[] trg_rows = new Mem_row[rslt_rows.length - offset]; + Array_.Copy_to(rslt_rows, offset, trg_rows, 0, trg_rows.length); + rslt_rows = trg_rows; + } + int limit = qry2.Limit(); + if (limit != Db_qry__select_cmd.Limit__disabled) { + Mem_row[] trg_rows = new Mem_row[limit]; + Array_.Copy_to(rslt_rows, 0, trg_rows, 0, limit); + rslt_rows = trg_rows; + } + rslt_rows = Mem_exec_.Rows__select_flds(rslt_rows, qry2.Cols()); + } + return new Mem_rdr(select, rslt_rows); + } +} +class Mem_sorter implements gplx.core.lists.ComparerAble { + private final Sql_order_fld[] flds; + public Mem_sorter(Sql_order_fld[] flds) { + this.flds = flds; + } + public int compare(Object lhsObj, Object rhsObj) { + Mem_row lhs = (Mem_row)lhsObj; + Mem_row rhs = (Mem_row)rhsObj; + int flds_len = flds.length; + for (int i = 0; i < flds_len; ++i) { + Sql_order_fld fld = flds[i]; + Object lhs_val = lhs.Get_by(fld.Name); + Object rhs_val = rhs.Get_by(fld.Name); + int comp = CompareAble_.Compare_obj(lhs_val, rhs_val); + if (comp != CompareAble_.Same) return comp * (fld.Sort == Sql_order_fld.Sort__dsc ? -1 : 1); + } + return CompareAble_.Same; + } +} +class Mem_exec_ { + public static Mem_row[] Rows__join(int join_tid, Mem_row[] lhs_rows, Mem_row[] rhs_rows, String tbl_alias, Sql_join_fld[] join_flds) { + int join_flds_len = join_flds.length; + Bry_bfr bfr = Bry_bfr.new_(); + Hash_adp_bry rhs_hash = Hash_adp_bry.cs(); + int rhs_rows_len = rhs_rows.length; + for (int i = 0; i < rhs_rows_len; ++i) { + Mem_row rhs_row = rhs_rows[i]; + byte[] rhs_key = Rows__bld_key(bfr, Bool_.N, tbl_alias, rhs_row, join_flds, join_flds_len); + List_adp rhs_list = (List_adp)rhs_hash.Get_by_bry(rhs_key); + if (rhs_list == null) { + rhs_list = List_adp_.new_(); + rhs_hash.Add(rhs_key, rhs_list); + } + rhs_list.Add(rhs_row); + } + List_adp rv = List_adp_.new_(); + int lhs_len = lhs_rows.length; + for (int i = 0; i < lhs_len; ++i) { + Mem_row lhs_row = lhs_rows[i]; + byte[] lhs_key = Rows__bld_key(bfr, Bool_.Y, tbl_alias, lhs_row, join_flds, join_flds_len); + List_adp rhs_list = (List_adp)rhs_hash.Get_by_bry(lhs_key); + if (rhs_list == null) { + switch (join_tid) { + case Sql_tbl_itm.Tid__inner: continue; + case Sql_tbl_itm.Tid__left: break; + default: throw Err_.new_unhandled_default(join_tid); + } + } + int rhs_list_len = rhs_list == null ? 1 : rhs_list.Len(); + for (int j = 0; j < rhs_list_len; ++j) { + Mem_row rhs_row = rhs_list == null ? Mem_row.Null_row : (Mem_row)rhs_list.Get_at(j); + Mem_row merged = Rows__merge(lhs_row, rhs_row); + rv.Add(merged); + } + } + return (Mem_row[])rv.To_ary_and_clear(Mem_row.class); + } + public static Mem_row[] Rows__alias(Mem_row[] src_rows, String tbl_alias) { + int src_rows_len = src_rows.length; + Mem_row[] rv = new Mem_row[src_rows_len]; + for (int i = 0; i < src_rows_len; ++i) { + Mem_row src_row = src_rows[i]; + Mem_row trg_row = new Mem_row(); rv[i] = trg_row; + int src_flds_len = src_row.Len(); + for (int j = 0; j < src_flds_len; ++j) { + String fld = src_row.Fld_at(j); + Object val = src_row.Get_at(j); + trg_row.Add(Sql_select_fld.Bld_tbl_w_fld(tbl_alias, fld), val); + } + } + return rv; + } + private static byte[] Rows__bld_key(Bry_bfr bfr, boolean join_is_src, String trg_tbl, Mem_row row, Sql_join_fld[] join_flds, int join_flds_len) { + for (int i = 0; i < join_flds_len; ++i) { + if (i != 0) bfr.Add_byte_pipe(); + Sql_join_fld join_fld = join_flds[i]; + Object val = row.Get_by(join_fld.To_fld_sql(join_is_src, trg_tbl)); + bfr.Add_obj(val); + } + return bfr.To_bry_and_clear(); + } + private static Mem_row Rows__merge(Mem_row lhs, Mem_row rhs) { + Mem_row rv = new Mem_row(); + Rows__copy_to(lhs, rv); + Rows__copy_to(rhs, rv); + return rv; + } + private static void Rows__copy_to(Mem_row src, Mem_row trg) { + int src_len = src.Len(); + for (int i = 0; i < src_len; ++i) { + String fld = src.Fld_at(i); + Object val = src.Get_by_or_dbnull(fld); + trg.Add(fld, val); + } + } + public static Mem_row[] Rows__select_flds(Mem_row[] src_rows, Sql_select_clause cols) { + Sql_select_fld_list select_flds = cols.Flds; int select_flds_len = select_flds.Len(); + int src_rows_len = src_rows.length; + Mem_row[] rv = new Mem_row[src_rows_len]; + for (int i = 0; i < src_rows_len; ++i) { // loop over each row + Mem_row src_row = src_rows[i]; + Mem_row trg_row = new Mem_row(); rv[i] = trg_row; + for (int j = 0; j < select_flds_len; ++j) { // loop over each fld + Sql_select_fld fld = select_flds.Get_at(j); + if (String_.Eq(fld.Alias, Sql_select_fld.Fld__wildcard)) { // wildcard; add all cols + for (int k = 0; k < src_row.Len(); ++k) { + String key = src_row.Fld_at(k); + Object val = src_row.Get_by_or_dbnull(key); + trg_row.Add(key, val); + } + } + else { // regular field; add it only + String key = fld.To_fld_key(); + Object val = src_row.Get_by_or_dbnull(key); + trg_row.Add(fld.To_fld_alias(), val); + } + } + } + return rv; + } + public static String[] Flds__to_str_ary(Sql_select_fld_list flds) { + int len = flds.Len(); + String[] rv = new String[len]; + for (int i = 0; i < len; ++i) + rv[i] = flds.Get_at(i).Fld; + return rv; + } + public static void Where__filter(List_adp rv, Mem_row[] rows, Mem_stmt stmt, Criteria crt) { + rv.Clear(); + int rows_len = rows.length; + for (int i = 0; i < rows_len; ++i) { + Mem_row itm = rows[i]; + if (crt.Matches(itm)) + rv.Add(itm); + } + } +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select_tst.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select_tst.java new file mode 100644 index 000000000..995929edc --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_exec_select_tst.java @@ -0,0 +1,130 @@ +/* +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.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import org.junit.*; import gplx.dbs.sqls.itms.*; +public class Mem_exec_select_tst { + private final Mem_db_fxt__single fxt = new Mem_db_fxt__single(); + @Test public void Basic() { + fxt.Exec__create_tbl("tbl_1", "fld_1"); + fxt.Exec__insert("tbl_1" + , String_.Ary("a_1") + , String_.Ary("a_2") + , String_.Ary("a_0") + ); + + // select all + fxt.Test__select(Db_qry_.select_().From_("tbl_1").Cols_all_() + , String_.Ary("a_1") + , String_.Ary("a_2") + , String_.Ary("a_0") + ); + + // order by + fxt.Test__select(Db_qry_.select_().From_("tbl_1").Cols_all_().Order_("fld_1", Bool_.N) + , String_.Ary("a_2") + , String_.Ary("a_1") + , String_.Ary("a_0") + ); + + // offset + fxt.Test__select(Db_qry_.select_().From_("tbl_1").Cols_all_().Offset_(1) + , String_.Ary("a_2") + , String_.Ary("a_0") + ); + + // limit + fxt.Test__select(Db_qry_.select_().From_("tbl_1").Cols_all_().Limit_(2) + , String_.Ary("a_1") + , String_.Ary("a_2") + ); + } + @Test public void Join__single() { + fxt.Exec__create_tbl("tbl_1", "fld_a", "fld_1a"); + fxt.Exec__create_tbl("tbl_2", "fld_a", "fld_2a"); + fxt.Exec__insert("tbl_1" + , String_.Ary("a_0", "1a_0") + , String_.Ary("a_1", "1a_1") + , String_.Ary("a_2", "1a_2") + ); + fxt.Exec__insert("tbl_2" + , String_.Ary("a_0", "2a_0") + , String_.Ary("a_2", "2a_2") + ); + + // inner join + fxt.Test__select(Db_qry_.select_() + .Cols_w_tbl_("t1", "fld_a", "fld_1a").Cols_w_tbl_("t2", "fld_2a") + .From_("tbl_1", "t1") + . Join_("tbl_2", "t2", Db_qry_.New_join__join("fld_a", "t1", "fld_a")) + , String_.Ary("a_0", "1a_0", "2a_0") + , String_.Ary("a_2", "1a_2", "2a_2") + ); + + // left join + fxt.Test__select(Db_qry_.select_() + .Cols_w_tbl_("t1", "fld_a", "fld_1a").Cols_w_tbl_("t2", "fld_2a") + .From_("tbl_1", "t1") + . Join_(Sql_tbl_itm.Tid__left, Sql_tbl_itm.Db__null, "tbl_2", "t2", Db_qry_.New_join__join("fld_a", "t1", "fld_a")) + , String_.Ary("a_0", "1a_0", "2a_0") + , String_.Ary("a_1", "1a_1", Db_null.Null_str) + , String_.Ary("a_2", "1a_2", "2a_2") + ); + } + @Test public void Join__many() { + fxt.Exec__create_tbl("tbl_1", "fld_a", "fld_1a"); + fxt.Exec__create_tbl("tbl_2", "fld_a", "fld_2a"); + fxt.Exec__insert("tbl_1" + , String_.Ary("a_0", "1a_0") + , String_.Ary("a_1", "1a_1") + ); + fxt.Exec__insert("tbl_2" + , String_.Ary("a_0", "2a_0") + , String_.Ary("a_0", "2a_1") + ); + + // inner join + fxt.Test__select(Db_qry_.select_() + .Cols_w_tbl_("t1", "fld_a", "fld_1a").Cols_w_tbl_("t2", "fld_2a") + .From_("tbl_1", "t1") + . Join_("tbl_2", "t2", Db_qry_.New_join__join("fld_a", "t1", "fld_a")) + , String_.Ary("a_0", "1a_0", "2a_0") + , String_.Ary("a_0", "1a_0", "2a_1") + ); + + // left join + fxt.Test__select(Db_qry_.select_() + .Cols_w_tbl_("t1", "fld_a", "fld_1a").Cols_w_tbl_("t2", "fld_2a") + .From_("tbl_1", "t1") + . Join_(Sql_tbl_itm.Tid__left, Sql_tbl_itm.Db__null, "tbl_2", "t2", Db_qry_.New_join__join("fld_a", "t1", "fld_a")) + , String_.Ary("a_0", "1a_0", "2a_0") + , String_.Ary("a_0", "1a_0", "2a_1") + , String_.Ary("a_1", "1a_1", Db_null.Null_str) + ); + } +} +class Mem_db_fxt__single { + private final Mem_db_fxt mem_fxt; + private final Db_conn conn; + public Mem_db_fxt__single() { + this.mem_fxt = new Mem_db_fxt(); + this.conn = mem_fxt.Make_conn("mem/test.db"); + } + public void Exec__create_tbl (String tbl, String... fld_names) {mem_fxt.Exec__create_tbl(conn, tbl, fld_names);} + public void Exec__insert (String tbl, String[]... rows) {mem_fxt.Exec__insert(conn, tbl, rows);} + public void Test__select (Db_qry qry, String[]... expd) {mem_fxt.Test__select(conn, qry, expd);} +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_rdr.java similarity index 92% rename from 140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java rename to 140_dbs/src/gplx/dbs/engines/mems/Mem_rdr.java index 45c27c996..9df5d0902 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_rdr.java @@ -16,10 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Db_rdr__mem implements Db_rdr { +public class Mem_rdr implements Db_rdr { private final Mem_row[] rows; private int row_idx = -1; private final int rows_len; private Mem_row row; - public Db_rdr__mem(String[] cols, Mem_row[] rows) { + public Mem_rdr(String[] cols, Mem_row[] rows) { this.rows = rows; this.rows_len = rows.length; } public boolean Move_next() { @@ -39,6 +39,7 @@ public class Db_rdr__mem implements Db_rdr { public float Read_float(String k) {return Float_.cast(row.Get_by(k));} public double Read_double(String k) {return Double_.cast(row.Get_by(k));} public boolean Read_bool_by_byte(String k) {return Byte_.cast(row.Get_by(k)) == 1;} + public int Fld_len() {return row.Len();} public Object Read_obj(String k) {return row.Get_by(k);} public Object Read_at(int i) {return row.Get_at(i);} public void Rls() {} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_row.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_row.java index fd5d11280..5a74d3060 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Mem_row.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_row.java @@ -18,13 +18,22 @@ along with this program. If not, see . package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Mem_row implements GfoInvkAble { private final Ordered_hash hash = Ordered_hash_.New(); - public Object Get_by(String key) {return hash.Get_by(key);} + private final Ordered_hash flds = Ordered_hash_.New(); + public int Len() {return hash.Len();} + public String Fld_at(int i) {return (String)flds.Get_at(i);} public Object Get_at(int i) {return hash.Get_at(i);} - public void Set_by(String key, Object val) {hash.Add_if_dupe_use_nth(key, val);} - public void Add(String key, Object val) {hash.Add(key, val);} + public Object Get_by(String key) {return hash.Get_by(key);} + public Object Get_by_or_dbnull(String key) { + Object rv = hash.Get_by(key); + return rv == null ? Db_null.Instance : rv; + } + public void Set_by(String key, Object val) {hash.Add_if_dupe_use_nth(key, val); flds.Add_if_dupe_use_1st(key, key);} + public void Add(String key, Object val) {hash.Add(key, val); flds.Add_if_dupe_use_1st(key, key);} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { Object rv = Get_by(k); if (rv == null) return GfoInvkAble_.Rv_unhandled; return rv; } + public static final Mem_row[] Ary_empty = new Mem_row[0]; + public static final Mem_row Null_row = new Mem_row(); } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_stmt.java similarity index 88% rename from 140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java rename to 140_dbs/src/gplx/dbs/engines/mems/Mem_stmt.java index 88176e0c8..b344f36b1 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_stmt.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import gplx.core.stores.*; -public class Db_stmt__mem implements Db_stmt { +public class Mem_stmt implements Db_stmt { private static final String Key_na = ""; // key is not_available; only called by procs with signature of Val( v); private final Ordered_hash val_list = Ordered_hash_.New(); - public Db_stmt__mem(Db_engine__mem engine, Db_qry qry) {Ctor_stmt(engine, qry);} private Db_engine__mem engine; - public void Ctor_stmt(Db_engine engine, Db_qry qry) {this.engine = (Db_engine__mem)engine; this.qry = qry;} - public Hash_adp Crts() {return crt_hash;} private final Hash_adp crt_hash = Hash_adp_.new_(); + public Mem_stmt(Mem_engine engine, Db_qry qry) {Ctor_stmt(engine, qry);} private Mem_engine engine; + public void Ctor_stmt(Db_engine engine, Db_qry qry) {this.engine = (Mem_engine)engine; this.qry = qry;} + public Mem_stmt_args Stmt_args() {return stmt_args;} private final Mem_stmt_args stmt_args = new Mem_stmt_args(); public int Args_len() {return val_list.Count();} public Object Args_get_at(int i) {return val_list.Get_at(i);} public Object Args_get_by(String k) {return val_list.Get_by(k);} @@ -30,7 +30,7 @@ public class Db_stmt__mem implements Db_stmt { public Db_stmt Reset_stmt() {return this;} public Db_stmt Clear() { val_list.Clear(); - crt_hash.Clear(); + stmt_args.Clear(); return this; } public void Rls() {this.Clear();} @@ -120,35 +120,29 @@ public class Db_stmt__mem implements Db_stmt { return this; } public boolean Exec_insert() { - Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + Mem_tbl tbl = engine.Tbls__get(qry.Base_table()); if (tbl == null) throw Err_.new_wo_type("must call Create_tbl", "tbl", qry.Base_table()); return tbl.Insert(this) == 1; } public int Exec_update() { - Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + Mem_tbl tbl = engine.Tbls__get(qry.Base_table()); return tbl.Update(this); } public int Exec_delete() { - Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + Mem_tbl tbl = engine.Tbls__get(qry.Base_table()); return tbl.Delete(this); } public DataRdr Exec_select() {throw Err_.new_unimplemented();} public Db_rdr Exec_select__rls_auto() {return this.Exec_select__rls_manual();} public Db_rdr Exec_select__rls_manual() { - Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); - return tbl.Select(this); +// Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); +// return tbl.Select(this); + return engine.Qry_runner().Select(this); } public Object Exec_select_val() {throw Err_.new_unimplemented();} private void Add(String k, boolean where, Object v) { - if (k == Dbmeta_fld_itm.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions val_list.Add_if_dupe_use_1st(k, v); // NOTE: only add if new; WHERE with IN will call Add many times; fld_ttl IN ('A.png', 'B.png'); - if (where) { - List_adp list = (List_adp)crt_hash.Get_by(k); - if (list == null) { - list = List_adp_.new_(); - crt_hash.Add(k, list); - } - list.Add(v); - } + if (where) stmt_args.Add(k, v); } } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_stmt_args.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_stmt_args.java new file mode 100644 index 000000000..5323c6bf8 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_stmt_args.java @@ -0,0 +1,77 @@ +/* +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.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import gplx.core.criterias.*; +public class Mem_stmt_args { + private final List_adp list = List_adp_.new_(); + private int cur_idx = -1; + public void Clear() {list.Clear(); cur_idx = -1;} + public void Add(String k, Object v) {list.Add(Keyval_.new_(k, v));} + public Keyval Get_next() { + int idx = ++cur_idx; + return idx == list.Count() ? null: (Keyval)list.Get_at(idx); + } +} +class Mem_stmt_args_ { + public static void Fill(Mem_stmt_args args, Criteria crt) { + int tid = crt.Tid(); + if (tid == Criteria_.Tid_wrapper) { + Criteria_fld fld = (Criteria_fld)crt; + Criteria sub = fld.Crt(); + String fld_key = fld.Key(); + switch (sub.Tid()) { + case Criteria_.Tid_eq: + case Criteria_.Tid_comp: + case Criteria_.Tid_like: + case Criteria_.Tid_iomatch: + Keyval kvp = args.Get_next(); + if (!String_.Eq(kvp.Key(), fld.Key())) throw Err_.new_("db", "fld_crt.key mismatch", "fld.key", fld_key, "kvp.key", kvp.Key()); + sub.Val_as_obj_(kvp.Val()); + break; + case Criteria_.Tid_in: + Criteria_in crt_in = (Criteria_in)sub; + Object[] ary = crt_in.Ary(); int ary_len = crt_in.Ary_len(); + for (int i = 0; i < ary_len; ++i) + ary[i] = args.Get_next().Val(); + break; + case Criteria_.Tid_between: + Criteria_between crt_between = (Criteria_between)sub; + crt_between.Lo_((Comparable)(args.Get_next()).Val()); + crt_between.Hi_((Comparable)(args.Get_next()).Val()); + break; + default: throw Err_.new_unhandled(sub.Tid()); + } + } + else { + switch (tid) { + case Criteria_.Tid_const: break; // true / false; nothing to fill + case Criteria_.Tid_and: + case Criteria_.Tid_or: + Criteria_bool_base crt_dual = (Criteria_bool_base)crt; + Fill(args, crt_dual.Lhs()); + Fill(args, crt_dual.Rhs()); + break; + case Criteria_.Tid_not: + Criteria_not crt_not = (Criteria_not)crt; + Fill(args, crt_not.Crt()); + break; + default: throw Err_.new_unhandled(tid); + } + } + } +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java index 42c0f7dae..e0a13997c 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java @@ -19,11 +19,12 @@ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs import gplx.core.primitives.*; import gplx.core.criterias.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.itms.*; import gplx.dbs.metas.*; public class Mem_tbl { - private final List_adp rows = List_adp_.new_(); private final List_adp where_rows = List_adp_.new_(); + private final List_adp where_rows = List_adp_.new_(); private final Hash_adp autonum_hash = Hash_adp_.new_(); public Mem_tbl(Dbmeta_tbl_itm meta) {this.meta = meta;} public Dbmeta_tbl_itm Meta() {return meta;} private final Dbmeta_tbl_itm meta; - public int Insert(Db_stmt__mem stmt) { + public final List_adp rows = List_adp_.new_(); + public int Insert(Mem_stmt stmt) { Mem_row itm = new Mem_row(); Dbmeta_fld_mgr flds = meta.Flds(); int len = flds.Len(); @@ -31,6 +32,7 @@ public class Mem_tbl { Dbmeta_fld_itm fld = flds.Get_at(i); String fld_name = fld.Name(); Object val = fld.Autonum() ? Autonum_calc(fld_name) : stmt.Args_get_by(fld_name); + if (val == null) continue; // NOTE: allow Bulk_insert from test to skip filds itm.Set_by(fld_name, val); } rows.Add(itm); @@ -44,10 +46,11 @@ public class Mem_tbl { } return autonum_itm.Val_add(); } - public int Update(Db_stmt__mem stmt) { + public int Update(Mem_stmt stmt) { Db_qry_update qry = (Db_qry_update)stmt.Qry(); - qry.Where().Val_from_args(stmt.Crts()); - Select_rows_where(where_rows, stmt, qry.Where()); + Criteria where_crt = qry.Where(); if (where_crt == null) where_crt = Criteria_.All; + Mem_stmt_args_.Fill(stmt.Stmt_args(), where_crt); + Select_rows_where(where_rows, stmt, where_crt); int where_rows_len = where_rows.Count(); String[] update_cols = qry.Cols_for_update(); int update_cols_len = update_cols.length; for (int i = 0; i < where_rows_len; ++i) { @@ -57,9 +60,9 @@ public class Mem_tbl { } return where_rows_len; } - public int Delete(Db_stmt__mem stmt) { + public int Delete(Mem_stmt stmt) { Db_qry_delete qry = (Db_qry_delete)stmt.Qry(); - qry.Where().Val_from_args(stmt.Crts()); + Mem_stmt_args_.Fill(stmt.Stmt_args(), qry.Where()); Select_rows_where(where_rows, stmt, qry.Where()); int where_rows_len = where_rows.Count(); for (int i = 0; i < where_rows_len; ++i) { @@ -68,7 +71,7 @@ public class Mem_tbl { } return where_rows_len; } - public Db_rdr Select(Db_stmt__mem stmt) { + public Db_rdr Select(Mem_stmt stmt) { String[] select = null; Criteria where = null; Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.as_(stmt.Qry()); if (qry == null) { @@ -80,9 +83,9 @@ public class Mem_tbl { select = qry.Select_flds(); where = qry.Where(); } - where.Val_from_args(stmt.Crts()); + Mem_stmt_args_.Fill(stmt.Stmt_args(), where); Select_rows_where(where_rows, stmt, where); - return new Db_rdr__mem(select, (Mem_row[])where_rows.To_ary_and_clear(Mem_row.class)); + return new Mem_rdr(select, (Mem_row[])where_rows.To_ary_and_clear(Mem_row.class)); } private String[] To_str_ary(Sql_select_fld_list flds) { int len = flds.Len(); @@ -91,7 +94,7 @@ public class Mem_tbl { rv[i] = flds.Get_at(i).Fld; return rv; } - private void Select_rows_where(List_adp rv, Db_stmt__mem stmt, Criteria crt) { + private void Select_rows_where(List_adp rv, Mem_stmt stmt, Criteria crt) { rv.Clear(); int rows_len = rows.Count(); for (int i = 0; i < rows_len; ++i) { diff --git a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java index df4c78f3c..26d1f3990 100644 --- a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java +++ b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java @@ -17,9 +17,15 @@ along with this program. If not, see . */ package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Mysql_conn_info extends Db_conn_info__base { - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mysql"; - public String Uid() {return uid;} private String uid; - public String Pwd() {return pwd;} private String pwd; + public Mysql_conn_info(String raw, String db_api, String database, String server, String uid, String pwd) {super(raw, db_api, database); + this.server = server; + this.uid = uid; + this.pwd = pwd; + } + @Override public String Key() {return Tid_const;} public static final String Tid_const = "mysql"; + public String Server() {return server;} private final String server; + public String Uid() {return uid;} private final String uid; + public String Pwd() {return pwd;} private final String pwd; public static Db_conn_info new_(String server, String database, String uid, String pwd) { return Db_conn_info_.parse(Bld_raw ( "gplx_key", Tid_const @@ -30,12 +36,10 @@ public class Mysql_conn_info extends Db_conn_info__base { , "charset", "utf8" )); } - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Mysql_conn_info rv = new Mysql_conn_info(); - rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("charset", "utf8"))); - rv.uid = m.ReadStr("uid"); - rv.pwd = m.ReadStr("pwd"); - return rv; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + return new Mysql_conn_info + ( raw, Bld_api(hash, Keyval_.new_("charset", "utf8")), hash.Get_val_as_str_or_fail("database") + , hash.Get_val_as_str_or_fail("server"), hash.Get_val_as_str_or_fail("uid"), hash.Get_val_as_str_or_fail("pwd")); } - public static final Mysql_conn_info Instance = new Mysql_conn_info(); Mysql_conn_info() {} + public static final Mysql_conn_info Instance = new Mysql_conn_info("", "", "", "", "", ""); } diff --git a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java index c4c5771a6..8d6ce39fe 100644 --- a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java +++ b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java @@ -30,7 +30,8 @@ public class Mysql_engine extends Db_engine_sql_base { @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {throw Err_.new_unimplemented();} @gplx.Internal @Override protected Connection Conn_new() { Mysql_conn_info conn_info_as_mysql = (Mysql_conn_info)conn_info; - return Conn_make_by_url("jdbc:mysql://localhost/" + conn_info_as_mysql.Database() + "?characterEncoding=UTF8", conn_info_as_mysql.Uid(), conn_info_as_mysql.Pwd()); + Connection rv = Conn_make_by_url("jdbc:mysql://localhost/" + conn_info_as_mysql.Database() + "?characterEncoding=UTF8&useSSL=false", conn_info_as_mysql.Uid(), conn_info_as_mysql.Pwd()); + return rv; } public static final Mysql_engine Instance = new Mysql_engine(); Mysql_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Noop_conn_info.java b/140_dbs/src/gplx/dbs/engines/nulls/Noop_conn_info.java index a2c556e76..8204ba2c2 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Noop_conn_info.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Noop_conn_info.java @@ -17,7 +17,8 @@ along with this program. If not, see . */ package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Noop_conn_info extends Db_conn_info__base { - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "null_db"; - @Override public Db_conn_info New_self(String raw, GfoMsg m) {return this;} - public static final Noop_conn_info Instance = new Noop_conn_info(); Noop_conn_info() {this.Ctor("", "", "gplx_key=null_db", "");} + public Noop_conn_info(String raw, String db_api, String database) {super(raw, db_api, database);} + @Override public String Key() {return Tid_const;} public static final String Tid_const = "null_db"; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) {return this;} + public static final Noop_conn_info Instance = new Noop_conn_info("gplx_key=null_db", "", ""); } diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java index d37308c03..854be437d 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java @@ -38,8 +38,10 @@ public class Noop_engine implements Db_engine { public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {} public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {} public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Db_conn conn) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} + public void Meta_reload() {} public boolean Meta_tbl_exists(String tbl) {return false;} public boolean Meta_fld_exists(String tbl, String fld) {return false;} public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); diff --git a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java index 56cb3bffc..337c4305e 100644 --- a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java +++ b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java @@ -17,9 +17,15 @@ along with this program. If not, see . */ package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Postgres_conn_info extends Db_conn_info__base { - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "postgresql"; - public String Uid() {return uid;} private String uid; - public String Pwd() {return pwd;} private String pwd; + public Postgres_conn_info(String raw, String db_api, String database, String server, String uid, String pwd) {super(raw, db_api, database); + this.server = server; + this.uid = uid; + this.pwd = pwd; + } + @Override public String Key() {return Tid_const;} public static final String Tid_const = "postgresql"; + public String Server() {return server;} private final String server; + public String Uid() {return uid;} private final String uid; + public String Pwd() {return pwd;} private final String pwd; public static Db_conn_info new_(String server, String database, String uid, String pwd) { return Db_conn_info_.parse(Bld_raw ( "gplx_key", Tid_const @@ -31,12 +37,10 @@ public class Postgres_conn_info extends Db_conn_info__base { , "encoding", "unicode" // needed for 1.1 conn; otherwise, ascii )); } - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Postgres_conn_info rv = new Postgres_conn_info(); - rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("encoding", "unicode"))); - rv.uid = m.ReadStr("user id"); - rv.pwd = m.ReadStr("password"); - return rv; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + return new Postgres_conn_info + ( raw, Bld_api(hash, Keyval_.new_("encoding", "unicode")), hash.Get_val_as_str_or_fail("database") + , hash.Get_val_as_str_or_fail("server"), hash.Get_val_as_str_or_fail("user id"), hash.Get_val_as_str_or_fail("password")); } - public static final Postgres_conn_info Instance = new Postgres_conn_info(); Postgres_conn_info() {} + public static final Postgres_conn_info Instance = new Postgres_conn_info("", "", "", "", "", ""); } diff --git a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java index 56e683dba..fb0402f47 100644 --- a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java +++ b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java @@ -29,8 +29,8 @@ public class Postgres_engine extends Db_engine_sql_base { @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);} @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {throw Err_.new_unimplemented();} @gplx.Internal @Override protected Connection Conn_new() { - Postgres_conn_info conn_info_as_postgres = (Postgres_conn_info)conn_info; - return Conn_make_by_url("jdbc:" + conn_info_as_postgres.Tid() + "://localhost/" + conn_info_as_postgres.Database(), conn_info_as_postgres.Uid(), conn_info_as_postgres.Pwd()); + Postgres_conn_info conn_info_as_postgres = (Postgres_conn_info)conn_info; + return Conn_make_by_url("jdbc:" + conn_info_as_postgres.Key() + "://localhost/" + conn_info_as_postgres.Database(), conn_info_as_postgres.Uid(), conn_info_as_postgres.Pwd()); } public static final Postgres_engine Instance = new Postgres_engine(); Postgres_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java index 7c58762b2..75275f20d 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java @@ -17,19 +17,20 @@ along with this program. If not, see . */ package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Sqlite_conn_info extends Db_conn_info__base { - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "sqlite"; - public Io_url Url() {return url;} private Io_url url; - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Sqlite_conn_info rv = new Sqlite_conn_info(); - String url = m.ReadStr("data source"); - rv.url = Io_url_.new_any_(url); - rv.Ctor("", url, raw, BldApi(m, KeyVal_.new_("version", "3"))); - rv.database = rv.url.NameOnly(); - return rv; + public Sqlite_conn_info(String raw, String db_api, String database, Io_url url) {super(raw, db_api, database);this.url = url;} + @Override public String Key() {return Key_const;} public static final String Key_const = "sqlite"; + public Io_url Url() {return url;} private final Io_url url; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + Io_url url = Io_url_.new_any_(hash.Get_val_as_str_or_fail("data source")); + String db = url.NameOnly(); + String api = Bld_api(hash, Keyval_.new_("version", "3")); + return new Sqlite_conn_info(raw, api, db, url); } + + public static final Sqlite_conn_info Instance = new Sqlite_conn_info("", "", "", Io_url_.Empty); public static Db_conn_info load_(Io_url url) { return Db_conn_info_.parse(Bld_raw - ( "gplx_key" , Tid_const + ( "gplx_key" , Key_const , Cs__data_source , url.Xto_api() , Cs__version , Cs__version__3 )); @@ -37,12 +38,12 @@ public class Sqlite_conn_info extends Db_conn_info__base { public static Db_conn_info make_(Io_url url) { Io_mgr.Instance.CreateDirIfAbsent(url.OwnerDir()); return Db_conn_info_.parse(Bld_raw - ( "gplx_key" , Tid_const + ( "gplx_key" , Key_const , Cs__data_source , url.Xto_api() , Cs__version , Cs__version__3 )); } - public static final Sqlite_conn_info Instance = new Sqlite_conn_info(); Sqlite_conn_info() {} public static final String Cs__data_source = "data source", Cs__version = "version", Cs__version__3 = "3"; + public static Io_url To_url(Db_conn conn) {return ((Sqlite_conn_info)conn.Conn_info()).url;} } \ No newline at end of file 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 33215e6b7..09b426466 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -19,13 +19,14 @@ package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.d import java.sql.*; import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.qrys.*; +import org.sqlite.SQLiteConnection; public class Sqlite_engine extends Db_engine_sql_base { - private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr; + private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr; Sqlite_engine() { this.txn_mgr = new Sqlite_txn_mgr(this); this.schema_mgr = new Sqlite_schema_mgr(this); } - @Override public String Tid() {return Sqlite_conn_info.Tid_const;} + @Override public String Tid() {return Sqlite_conn_info.Key_const;} @Override public gplx.dbs.sqls.Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.Sqlite;} @Override public Db_engine New_clone(Db_conn_info connectInfo) { Sqlite_engine rv = new Sqlite_engine(); @@ -34,12 +35,18 @@ public class Sqlite_engine extends Db_engine_sql_base { } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Sqlite_rdr.new_(rdr, commandText);} @Override public Db_rdr New_rdr_clone() {return new Db_rdr__sqlite();} + @Override public void Env_db_attach(String alias, Db_conn conn) { + Db_conn_info cs_obj = conn.Conn_info(); if (!String_.Eq(cs_obj.Key(), Sqlite_conn_info.Key_const)) throw Err_.new_("dbs", "must attach to sqlite databases", "conn", cs_obj.Raw()); + Sqlite_conn_info cs = (Sqlite_conn_info)cs_obj; + Env_db_attach(alias, cs.Url()); + } @Override public void Env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));} @Override public void Env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));} @Override public void Txn_bgn(String name) {txn_mgr.Txn_bgn(name);} @Override public String Txn_end() {return txn_mgr.Txn_end();} @Override public void Txn_cxl() {txn_mgr.Txn_cxl();} @Override public void Txn_sav() {txn_mgr.Txn_sav();} + @Override public void Meta_reload() {schema_mgr.Tbl_load_all();} @Override public boolean Meta_tbl_exists(String tbl) {return schema_mgr.Tbl_exists(tbl);} @Override public boolean Meta_fld_exists(String tbl, String fld) {return schema_mgr.Fld_exists(tbl, fld);} @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {return schema_mgr.Tbl_load_all();} @@ -56,9 +63,12 @@ public class Sqlite_engine extends Db_engine_sql_base { } Sqlite_conn_info conn_info_as_sqlite = (Sqlite_conn_info)conn_info; Connection rv = Conn_make_by_url("jdbc:sqlite://" + String_.Replace(conn_info_as_sqlite.Url().Raw(), "\\", "/"), "", ""); + SQLiteConnection rv_as_sqlite = (org.sqlite.SQLiteConnection)rv; + try {rv_as_sqlite.setBusyTimeout(10000);} + catch (SQLException e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to set busy timeout; err=~{0}", Err_.Message_gplx_log(e));} return rv; } - public static final Sqlite_engine Instance = new Sqlite_engine(); + public static final Sqlite_engine Instance = new Sqlite_engine(); } class Db_rdr__sqlite extends Db_rdr__basic { @Override public byte Read_byte(String k) {try {return (byte)Int_.cast(rdr.getObject(k));} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "k", k, "type", Byte_.Cls_val_name);}} @Override public boolean Read_bool_by_byte(String k) { 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 f99fdae95..3201a7565 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java @@ -74,15 +74,6 @@ public class Sqlite_engine_ { usr_dlg.Log_many("", "", "index created: ~{0} ~{1}", file_id, index); } } - public static Db_conn Conn_load_or_make_(Io_url url, Bool_obj_ref created) { - boolean exists = Io_mgr.Instance.ExistsFil(url); - created.Val_(!exists); - Db_conn_info connect = exists ? Sqlite_conn_info.load_(url) : Sqlite_conn_info.make_(url); - Db_conn p = Db_conn_pool.Instance.Get_or_new(connect); - if (!exists) - Pragma_page_size(p, 4096); - return p; - } public static final int Stmt_arg_max = 999; // 999 is max number of variables allowed by sqlite public static final boolean Supports_read_binary_stream = false; public static final boolean Supports_indexed_by = true; diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java index b8109516d..ffec58edf 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java @@ -38,7 +38,7 @@ public class Sqlite_schema_mgr { } private void Init(Db_engine engine) { init = false; - Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", engine.Conn_info().Xto_api()); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", engine.Conn_info().Db_api()); tbl_mgr.Clear(); idx_mgr.Clear(); Dbmeta_parser__tbl tbl_parser = new Dbmeta_parser__tbl(); Dbmeta_parser__idx idx_parser = new Dbmeta_parser__idx(); @@ -52,14 +52,15 @@ public class Sqlite_schema_mgr { int type_int = Dbmeta_itm_tid.Xto_int(type_str); switch (type_int) { case Dbmeta_itm_tid.Tid_table: - if (String_.Eq(name, "sqlite_sequence")) continue; // ignore b/c of non-orthodox syntax; EX: "CREATE TABLE sqlite_sequence(name, seq)"; + if (String_.Has_at_bgn(name, "sqlite_")) continue; // ignore b/c of non-orthodox syntax; EX: "CREATE TABLE sqlite_sequence(name, seq)"; also "CREATE TABLE sqlite_stat(tbl,idx,stat)"; tbl_mgr.Add(tbl_parser.Parse(Bry_.new_u8(sql))); break; case Dbmeta_itm_tid.Tid_index: + if (sql == null) continue; // ignore "autoindex"; EX: sqlite_autoindex_temp_page_len_avg_1 idx_mgr.Add(idx_parser.Parse(Bry_.new_u8(sql))); break; default: - Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.unknown type: conn=~{0} type=~{1} name=~{2} sql=~{3}", engine.Conn_info().Xto_api(), type_str, name, sql); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.unknown type: conn=~{0} type=~{1} name=~{2} sql=~{3}", engine.Conn_info().Db_api(), type_str, name, sql); break; } } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java index 48bd52351..281938f01 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java @@ -63,8 +63,10 @@ public class TdbEngine implements Db_engine { public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {throw Err_.new_unimplemented();} public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {throw Err_.new_unimplemented();} public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Db_conn conn) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} + public void Meta_reload() {} public boolean Meta_tbl_exists(String name) {return false;} public boolean Meta_fld_exists(String tbl, String fld) {return false;} public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java index ce474d276..2dfd146b3 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java @@ -49,7 +49,7 @@ class TdbInsertWkr implements Db_qryWkr { int InsertRowsByVals(TdbEngine engine, TdbTable tbl, Db_qry_insert insert) { GfoNde row = GfoNde_.vals_(tbl.Flds(), new Object[tbl.Flds().Count()]); for (int i = 0; i < insert.Args().Count(); i++) { - KeyVal kv = insert.Args().Get_at(i); + Keyval kv = insert.Args().Get_at(i); Db_arg arg = (Db_arg)kv.Val(); row.Write(kv.Key(), arg.Val); } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbSelect.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbSelect.java index aa1bab260..6a4f60d0c 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbSelect.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbSelect.java @@ -24,11 +24,11 @@ class TdbSelectWkr implements Db_qryWkr { if (cmd.From().Tbls.Count() > 1) throw Err_.new_("gplx.tdbs", "joins not supported for tdbs", "sql", cmd.To_sql__exec(engineObj.Sql_wtr())); TdbTable tbl = engine.FetchTbl(cmd.From().Base_tbl.Name); - GfoNdeList rv = (cmd.Where_itm() == Sql_where_itm.Where__null && cmd.Limit() == Db_qry__select_cmd.Limit__disabled) ? rv = tbl.Rows() : FilterRecords(tbl, cmd.Where_itm().Root, cmd.Limit()); + GfoNdeList rv = (cmd.Where_itm() == Sql_where_clause.Where__null && cmd.Limit() == Db_qry__select_cmd.Limit__disabled) ? rv = tbl.Rows() : FilterRecords(tbl, cmd.Where_itm().Root, cmd.Limit()); if (cmd.GroupBy() != null) rv = TdbGroupByWkr.GroupByExec(cmd, rv, tbl); if (cmd.Order() != null) { // don't use null pattern here; if null ORDER BY, then don't call .Sort on GfoNdeList - ComparerAble comparer = Sql_order_fld_sorter.new_(cmd.Order().Flds); + ComparerAble comparer = Sql_order_fld_sorter.new_(cmd.Order().Flds()); rv.Sort_by(comparer); } return GfoNdeRdr_.peers_(rv, false); diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbUpdate.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbUpdate.java index cb8353661..022a57007 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbUpdate.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbUpdate.java @@ -37,7 +37,7 @@ class TdbUpdateWkr implements Db_qryWkr { } void UpdateRow(Db_qry_update cmd, GfoNde row) { for (int i = 0; i < cmd.Args().Count(); i++) { - KeyVal p = (KeyVal)cmd.Args().Get_at(i); + Keyval p = (Keyval)cmd.Args().Get_at(i); Db_arg prm = (Db_arg)p.Val(); row.Write(p.Key(), prm.Val); } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java b/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java index c6ec77e33..d4a9ec8f2 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java @@ -17,21 +17,21 @@ along with this program. If not, see . */ package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Tdb_conn_info extends Db_conn_info__base { - public Io_url Url() {return url;} Io_url url; - @Override public String Tid() {return Tid_const;} public static final String Tid_const = "tdb"; - public static Db_conn_info new_(Io_url url) { + public Tdb_conn_info(String raw, String db_api, String database, Io_url url) {super(raw, db_api, database);this.url = url; this.server = url.Raw(); } + @Override public String Key() {return Tid_const;} public static final String Tid_const = "tdb"; + public Io_url Url() {return url;} private final Io_url url; + public String Server() {return server;} private final String server; + @Override public Db_conn_info New_self(String raw, Keyval_hash hash) { + Io_url url = Io_url_.new_any_(hash.Get_val_as_str_or_fail("url")); + String db = url.NameOnly(); + String api = Bld_api(hash, Keyval_.new_("version", "3")); + return new Tdb_conn_info(raw, api, db, url); + } + public static Db_conn_info new_(Io_url url) { return Db_conn_info_.parse(Bld_raw ( "gplx_key", Tid_const , "url", url.Raw() )); - } Tdb_conn_info() {} - @Override public Db_conn_info New_self(String raw, GfoMsg m) { - Tdb_conn_info rv = new Tdb_conn_info(); - String urlStr = m.ReadStr("url"); - Io_url url = Io_url_.new_any_(urlStr); - rv.Ctor(urlStr, url.NameOnly(), raw, BldApi(m)); - rv.url = url; - return rv; } - public static final Tdb_conn_info Instance = new Tdb_conn_info(); + public static final Tdb_conn_info Instance = new Tdb_conn_info("", "", "", Io_url_.Empty); } diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java index fddec7b4f..46786efa5 100644 --- a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java @@ -25,4 +25,11 @@ public class Dbmeta_fld_mgr { public Dbmeta_fld_itm Get_at(int idx) {return (Dbmeta_fld_itm)hash.Get_at(idx);} public Dbmeta_fld_itm Get_by(String name) {return (Dbmeta_fld_itm)hash.Get_by(name);} public Dbmeta_fld_itm[] To_ary() {return hash.Count() == 0 ? Dbmeta_fld_itm.Ary_empty : (Dbmeta_fld_itm[])hash.To_ary(Dbmeta_fld_itm.class);} + public Dbmeta_fld_list To_fld_list() { + Dbmeta_fld_list rv = Dbmeta_fld_list.new_(); + int len = hash.Count(); + for (int i = 0; i < len; ++i) + rv.Add(Get_at(i)); + return rv; + } } diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java index 6f3d224b9..69142dabf 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java @@ -94,25 +94,54 @@ class Dbmeta_fld_wkr__default extends Dbmeta_fld_wkr__base { Object default_val = null; rdr.Skip_ws(); byte[] src = rdr.Src(); - byte b = src[rdr.Pos()]; - switch (b) { - case Byte_ascii.Quote: - case Byte_ascii.Apos: + switch (fld.Type().Tid_ansi()) { + case Dbmeta_fld_tid.Tid__bool: + case Dbmeta_fld_tid.Tid__byte: + case Dbmeta_fld_tid.Tid__short: + case Dbmeta_fld_tid.Tid__int: default_val = Int_.parse(Read_str_to_end_of_num(rdr)); break; + case Dbmeta_fld_tid.Tid__long: default_val = Long_.parse(Read_str_to_end_of_num(rdr)); break; + case Dbmeta_fld_tid.Tid__float: default_val = Float_.parse(Read_str_to_end_of_num(rdr)); break; + case Dbmeta_fld_tid.Tid__double: default_val = Double_.parse(Read_str_to_end_of_num(rdr)); break; + case Dbmeta_fld_tid.Tid__decimal: default_val = Decimal_adp_.parse(Read_str_to_end_of_num(rdr)); break; + case Dbmeta_fld_tid.Tid__str: + case Dbmeta_fld_tid.Tid__text: + case Dbmeta_fld_tid.Tid__bry: + byte b = src[rdr.Pos()]; int bgn_pos = rdr.Pos() + 1; int end_pos = Bry_find_.Find_fwd(src, b, bgn_pos); if (end_pos == Bry_find_.Not_found) rdr.Err_wkr().Fail("unclosed quote"); default_val = Bry_.Mid(src, bgn_pos, end_pos); rdr.Move_to(end_pos + 1); break; - case Byte_ascii.Dash: - 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: - default_val = rdr.Read_int_to_non_num(); - break; - default: - rdr.Err_wkr().Fail("invalid field_default"); break; + case Dbmeta_fld_tid.Tid__date: throw Err_.new_unhandled_default(fld.Type().Tid_ansi()); } fld.Default_(default_val); } + public String Read_str_to_end_of_num(Bry_rdr rdr) { + int bgn = rdr.Pos(); + int pos = bgn, end = bgn; + int src_end = rdr.Src_end(); + byte[] src = rdr.Src(); + boolean loop = true; + while (loop) { + if (pos >= src_end) { + end = src_end; + break; + } + byte b = src[pos]; ++pos; + switch (b) { + case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: + case Byte_ascii.Paren_end: + case Byte_ascii.Comma: + end = pos - 1; + loop = false; + break; + default: + break; + } + } + rdr.Move_to(end); + return String_.new_a7(src, bgn, end); + } @Override protected void When_match(Dbmeta_fld_itm fld) {} private static final byte[] Hook = Bry_.new_a7("default"); public static final Dbmeta_fld_wkr__default Instance = new Dbmeta_fld_wkr__default(); diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java index 1027dffa2..8dcf72a2a 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java @@ -27,13 +27,13 @@ public class Dbmeta_parser__fld_tst { fxt.Test_parse_type(" decimal ( 12 , 10 )" , fxt.Make_type(Dbmeta_fld_tid.Tid__decimal, 12, 10)); } @Test public void Parse_fld() { - fxt.Test_parse_fld("name_1 int" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_unknown)); - fxt.Test_parse_fld("name_1 int null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_null)); - fxt.Test_parse_fld("name_1 int not null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null)); - fxt.Test_parse_fld("name_1 int not null autoincrement" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.N, Bool_.Y)); - fxt.Test_parse_fld("name_1 int not null primary key" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N)); - fxt.Test_parse_fld("name_1 int not null default -1" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, -1)); - fxt.Test_parse_fld("name_1 int not null default 'abc'" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, "abc")); + fxt.Test_parse_fld("name_1 int" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_unknown)); + fxt.Test_parse_fld("name_1 int null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_null)); + fxt.Test_parse_fld("name_1 int not null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null)); + fxt.Test_parse_fld("name_1 int not null autoincrement" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.N, Bool_.Y)); + fxt.Test_parse_fld("name_1 int not null primary key" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N)); + fxt.Test_parse_fld("name_1 int not null default -1" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, -1)); + fxt.Test_parse_fld("name_1 varchar(3) not null default 'abc'" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__str, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, "abc")); } } class Dbmeta_parser__fld_fxt { diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry__select_cmd.java b/140_dbs/src/gplx/dbs/qrys/Db_qry__select_cmd.java index 9d145381c..2044ebe32 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry__select_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry__select_cmd.java @@ -22,92 +22,89 @@ public class Db_qry__select_cmd implements Db_qry { public int Tid() {return Db_qry_.Tid_select;} public boolean Exec_is_rdr() {return Bool_.Y;} public String Base_table() {return from.Base_tbl.Name;} - public Sql_from_itm From() {return from;} private Sql_from_itm from; + public Sql_from_clause From() {return from;} private Sql_from_clause from; public Db_qry__select_cmd From_(String tbl) {return From_(tbl, Sql_tbl_itm.Alias__null);} public Db_qry__select_cmd From_(String name, String alias) {return From_(Sql_tbl_itm.Db__null, name, alias);} public Db_qry__select_cmd From_(String db, String tbl, String alias) { if (from != null) throw Err_.new_("sql_qry", "super table already defined", "from", from.Base_tbl.Name); - from = new Sql_from_itm(new Sql_tbl_itm(Sql_tbl_itm.Tid__from, db, tbl, alias, Sql_join_itm.Ary__empty)); + from = new Sql_from_clause(new Sql_tbl_itm(Sql_tbl_itm.Tid__from, db, tbl, alias, Sql_join_fld.Ary__empty)); return this; } - public Db_qry__select_cmd Join_(String name, String alias, Sql_join_itm... join_flds) {return Join_(Sql_tbl_itm.Db__null, name, alias, join_flds);} - public Db_qry__select_cmd Join_(String db, String name, String alias, Sql_join_itm... join_flds) { + public Db_qry__select_cmd Join_(String name, String alias, Sql_join_fld... join_flds) {return Join_(Sql_tbl_itm.Tid__inner, Sql_tbl_itm.Db__null , name, alias, join_flds);} + public Db_qry__select_cmd Join_(String db, String name, String alias, Sql_join_fld... join_flds) {return Join_(Sql_tbl_itm.Tid__inner, db , name, alias, join_flds);} + public Db_qry__select_cmd Join_(int join_tid, String db, String name, String alias, Sql_join_fld... join_flds) { if (from == null) throw Err_.new_("sql_qry", "super table is not defined"); - from.Tbls.Add(new Sql_tbl_itm(Sql_tbl_itm.Tid__inner, db, name, alias, join_flds)); + from.Tbls.Add(new Sql_tbl_itm(join_tid, db, name, alias, join_flds)); return this; } - public Sql_select_itm Cols() {return cols;} private Sql_select_itm cols = Sql_select_itm.All; + public Sql_select_clause Cols() {return cols;} private Sql_select_clause cols = new Sql_select_clause(); public Db_qry__select_cmd Distinct_() {cols.Distinct = true; return this;} - public Db_qry__select_cmd Cols_all_() {cols = Sql_select_itm.All; return this;} - public Db_qry__select_cmd Cols_(String... ary) {return Cols_w_tbl_(Sql_select_fld.Tbl_null, ary);} + public Db_qry__select_cmd Cols_all_() {cols.Flds.Clear().Add(Sql_select_fld.Wildcard); return this;} + public Db_qry__select_cmd Cols_(String... ary) {return Cols_w_tbl_(Sql_select_fld.Tbl__null, ary);} public Db_qry__select_cmd Cols_w_tbl_(String tbl, String... ary) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); for (String itm : ary) cols.Flds.Add(Sql_select_fld.New_fld(tbl, itm, itm)); return this; } public Db_qry__select_cmd Cols_w_alias_(String expr, String alias) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); - cols.Flds.Add(Sql_select_fld.New_fld(Sql_select_fld.Tbl_null, expr, alias)); + cols.Flds.Add(Sql_select_fld.New_fld(Sql_select_fld.Tbl__null, expr, alias)); return this; } - public Sql_where_itm Where_itm() {return where_itm;} private Sql_where_itm where_itm = Sql_where_itm.All; + public Sql_where_clause Where_itm() {return where_itm;} private Sql_where_clause where_itm = Sql_where_clause.All; public Db_qry__select_cmd Where_(Criteria root) { - if (where_itm == Sql_where_itm.All) where_itm = new Sql_where_itm(); + if (where_itm == Sql_where_clause.All) where_itm = new Sql_where_clause(); where_itm.Root = root; return this; } public Db_qry__select_cmd Where_and(Criteria crt) { - if (where_itm == Sql_where_itm.All) throw Err_.new_("sql_qry", "where is not defined"); + if (where_itm == Sql_where_clause.All) throw Err_.new_("sql_qry", "where is not defined"); where_itm.Root = Criteria_.And(where_itm.Root, crt); return this; } - public Sql_order_itm Order() {return order;} private Sql_order_itm order = null; + public Sql_order_clause Order() {return order;} private Sql_order_clause order = null; public Db_qry__select_cmd Order_asc_(String fld) {return Order_(fld, Bool_.Y);} - public Db_qry__select_cmd Order_(String fld, boolean asc) {return Order_(Sql_order_fld.Tbl__null, fld, asc);} + public Db_qry__select_cmd Order_(String fld) {return Order_(Sql_order_fld.Tbl__null, fld, Bool_.Y);} + public Db_qry__select_cmd Order_(String fld, boolean asc) {return Order_(Sql_order_fld.Tbl__null, fld, asc);} + public Db_qry__select_cmd Order_(String tbl, String fld) {return Order_(tbl, fld, Bool_.Y);} public Db_qry__select_cmd Order_(String tbl, String fld, boolean asc) { + if (order == null) order = new Sql_order_clause(); Sql_order_fld item = new Sql_order_fld(tbl, fld, asc ? Sql_order_fld.Sort__nil : Sql_order_fld.Sort__dsc); - order = new Sql_order_itm(new Sql_order_fld[] {item}); + order.Flds__add(item); return this; } public Db_qry__select_cmd Order_asc_many_(String... flds) { + if (order == null) order = new Sql_order_clause(); int flds_len = flds.length; - Sql_order_fld[] ary = new Sql_order_fld[flds_len]; for (int i = 0; i < flds_len; ++i) - ary[i] = new Sql_order_fld(Sql_order_fld.Tbl__null, flds[i], Sql_order_fld.Sort__nil); - order = new Sql_order_itm(ary); + order.Flds__add(new Sql_order_fld(Sql_order_fld.Tbl__null, flds[i], Sql_order_fld.Sort__nil)); return this; } public int Limit() {return limit;} public Db_qry__select_cmd Limit_(int v) {this.limit = v; return this;} private int limit = Limit__disabled; public static final int Limit__disabled = Int_.Min_value; public int Offset() {return offset;} public Db_qry__select_cmd Offset_(int v) {this.offset = v; return this;} private int offset = Offset__disabled; public static final int Offset__disabled = Int_.Min_value; public String Indexed_by() {return indexed_by;} public Db_qry__select_cmd Indexed_by_(String v) {indexed_by = v; return this;} private String indexed_by; - public Sql_group_itm GroupBy() {return groupBy;} private Sql_group_itm groupBy = null; + public Sql_group_clause GroupBy() {return groupBy;} private Sql_group_clause groupBy = null; public Db_qry__select_cmd GroupBy_(String... flds) { if (groupBy != null) throw Err_.new_("sql_qry", "group by already defined", "group", groupBy); - groupBy = Sql_group_itm.new_(flds); + groupBy = Sql_group_clause.new_(flds); return this; } public Db_qry__select_cmd Cols_groupBy_max(String fld) {return Cols_groupBy_max(fld, fld);} public Db_qry__select_cmd Cols_groupBy_max(String fld, String alias) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); - cols.Flds.Add(Sql_select_fld.New_max(Sql_select_fld.Tbl_null, fld, alias)); + cols.Flds.Add(Sql_select_fld.New_max(Sql_select_fld.Tbl__null, fld, alias)); return this; } public Db_qry__select_cmd Cols_groupBy_min(String fld, String alias) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); - cols.Flds.Add(Sql_select_fld.New_min(Sql_select_fld.Tbl_null, fld, alias)); + cols.Flds.Add(Sql_select_fld.New_min(Sql_select_fld.Tbl__null, fld, alias)); return this; } public Db_qry__select_cmd Cols_groupBy_count(String fld, String alias) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); - cols.Flds.Add(Sql_select_fld.New_count(Sql_select_fld.Tbl_null, fld, alias)); + cols.Flds.Add(Sql_select_fld.New_count(Sql_select_fld.Tbl__null, fld, alias)); return this; } public Db_qry__select_cmd Cols_groupBy_sum(String fld) {return Cols_groupBy_sum(fld, fld);} public Db_qry__select_cmd Cols_groupBy_sum(String fld, String alias) { - if (cols == Sql_select_itm.All) cols = new Sql_select_itm(); - cols.Flds.Add(Sql_select_fld.New_sum(Sql_select_fld.Tbl_null, fld, alias)); + cols.Flds.Add(Sql_select_fld.New_sum(Sql_select_fld.Tbl__null, fld, alias)); return this; } 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 72b791d6c..8a6d3e240 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java @@ -26,7 +26,7 @@ public class Db_qry_insert implements Db_arg_owner { public String Base_table() {return base_table;} private String base_table; public String[] Cols_for_insert() {return cols_for_insert;} private String[] cols_for_insert; public Db_arg_owner From_(String tbl) {base_table = tbl; return this;} - public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); + public Keyval_hash Args() {return args;} private final Keyval_hash args = new Keyval_hash(); public Db_arg_owner Val_byte(String k, byte v) {return Val_obj_type(k, v, Db_val_type.Tid_byte);} public Db_arg_owner Val_int(String k, int v) {return Val_obj_type(k, v, Db_val_type.Tid_int32);} public Db_arg_owner Val_long(String k, long v) {return Val_obj_type(k, v, Db_val_type.Tid_int64);} @@ -48,7 +48,7 @@ public class Db_qry_insert implements Db_arg_owner { public Db_qry_insert Cols_(String... ary) { if (cols == null) cols = new Sql_select_fld_list(); for (String fld : ary) - cols.Add(Sql_select_fld.New_fld(Sql_select_fld.Tbl_null, fld, fld)); + cols.Add(Sql_select_fld.New_fld(Sql_select_fld.Tbl__null, fld, fld)); return this; } public Sql_select_fld_list Cols() {return cols;} private Sql_select_fld_list cols; 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 8c992035c..15babe3be 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_sql.java @@ -26,7 +26,7 @@ public class Db_qry_sql implements Db_qry { public static Db_qry_sql dml_(String sql) {return sql_(sql);} public static Db_qry_sql ddl_(String sql) {return sql_(sql);} public static Db_qry_sql xtn_(String sql) {return sql_(sql);} - static Db_qry_sql sql_(String sql) { + public static Db_qry_sql sql_(String sql) { Db_qry_sql rv = new Db_qry_sql(); rv.sql = sql; rv.isReader = false; return rv; 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 5ce9eb5d1..996c08731 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java @@ -26,7 +26,7 @@ public class Db_qry_update implements Db_arg_owner { public String[] Cols_for_update() {return cols_for_update;} private String[] cols_for_update; public Criteria Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = crt; return this;} private Criteria where; public Db_arg_owner From_(String tbl) {base_table = tbl; return this;} - public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); + public Keyval_hash Args() {return args;} private final Keyval_hash args = new Keyval_hash(); public Db_arg_owner Val_byte(String k, byte v) {return Val_obj_type(k, v, Db_val_type.Tid_byte);} public Db_arg_owner Val_int(String k, int v) {return Val_obj_type(k, v, Db_val_type.Tid_int32);} public Db_arg_owner Val_long(String k, long v) {return Val_obj_type(k, v, Db_val_type.Tid_int64);} 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 1602d8073..f51c1e660 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java @@ -129,7 +129,7 @@ public class Db_stmt_cmd implements Db_stmt { catch (Exception e) { this.Rls(); Reset_stmt(); - throw Err_.new_exc(e, "db_stmt", "insert failed", "url", engine.Conn_info().Xto_api(), "sql", sql); + throw Err_.new_exc(e, "db_stmt", "insert failed", "url", engine.Conn_info().Db_api(), "sql", sql); } } public int Exec_update() { @@ -137,7 +137,7 @@ public class Db_stmt_cmd implements Db_stmt { catch (Exception e) { this.Rls(); Reset_stmt(); - throw Err_.new_exc(e, "db_stmt", "update failed", "url", engine.Conn_info().Xto_api(), "sql", sql); + throw Err_.new_exc(e, "db_stmt", "update failed", "url", engine.Conn_info().Db_api(), "sql", sql); } } public int Exec_delete() { @@ -145,7 +145,7 @@ public class Db_stmt_cmd implements Db_stmt { catch (Exception e) { this.Rls(); Reset_stmt(); - throw Err_.new_exc(e, "db_stmt", "delete failed", "url", engine.Conn_info().Xto_api(), "sql", sql); + throw Err_.new_exc(e, "db_stmt", "delete failed", "url", engine.Conn_info().Db_api(), "sql", sql); } } public DataRdr Exec_select() { diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_.java b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_.java index 362582ea0..e7a156f0f 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_.java @@ -18,10 +18,16 @@ along with this program. If not, see . package gplx.dbs.sqls; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.wtrs.*; public class Sql_qry_wtr_ { - public static final Sql_qry_wtr + public static final Sql_qry_wtr Basic = new Sql_core_wtr() , Mysql = new Sql_core_wtr__mysql() , Sqlite = new Sql_core_wtr__sqlite() ; + + public static final byte Like_wildcard = Byte_ascii.Percent; + public static String Quote_arg(String s) { // only for constructing DEBUG SQL strings + return "'" + String_.Replace(s, "'", "''") + "'"; + } + public static String Gen_placeholder_parameters(Db_qry qry) {return Sql_qry_wtr_.Sqlite.To_sql_str(qry, true);} // replace arguments with ?; EX: UPDATE a SET b = ? WHERE c = ?; } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_from_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_from_clause.java similarity index 91% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_from_itm.java rename to 140_dbs/src/gplx/dbs/sqls/itms/Sql_from_clause.java index c55acac0b..5708e828a 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_from_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_from_clause.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; -public class Sql_from_itm { - public Sql_from_itm(Sql_tbl_itm base_tbl) { +public class Sql_from_clause { + public Sql_from_clause(Sql_tbl_itm base_tbl) { this.Base_tbl = base_tbl; Tbls.Add(base_tbl); } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_group_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_group_clause.java similarity index 84% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_group_itm.java rename to 140_dbs/src/gplx/dbs/sqls/itms/Sql_group_clause.java index 0c40141d6..3947e812e 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_group_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_group_clause.java @@ -16,13 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; -public class Sql_group_itm { +public class Sql_group_clause { public List_adp Flds() {return flds;} List_adp flds = List_adp_.new_(); - public static Sql_group_itm new_(String... ary) { - Sql_group_itm rv = new Sql_group_itm(); + public static Sql_group_clause new_(String... ary) { + Sql_group_clause rv = new Sql_group_clause(); for (String itm : ary) rv.flds.Add(itm); return rv; - } Sql_group_itm() {} + } Sql_group_clause() {} } \ No newline at end of file diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_join_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_join_fld.java similarity index 75% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_join_itm.java rename to 140_dbs/src/gplx/dbs/sqls/itms/Sql_join_fld.java index df91d228d..cc8046609 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_join_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_join_fld.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; -public class Sql_join_itm { - public Sql_join_itm(String trg_fld, String src_tbl, String src_fld) { +public class Sql_join_fld { + public Sql_join_fld(String trg_fld, String src_tbl, String src_fld) { this.Trg_fld = trg_fld; this.Src_tbl = src_tbl; this.Src_fld = src_fld; @@ -26,5 +26,9 @@ public class Sql_join_itm { public final String Src_fld; public final String Trg_fld; - public static final Sql_join_itm[] Ary__empty = new Sql_join_itm[0]; + public String To_fld_sql(boolean fld_is_src, String trg_tbl) { + return fld_is_src ? Src_tbl + "." + Src_fld : trg_tbl + "." + Trg_fld; + } + + public static final Sql_join_fld[] Ary__empty = new Sql_join_fld[0]; } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_order_clause.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_order_clause.java new file mode 100644 index 000000000..be7f156c5 --- /dev/null +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_order_clause.java @@ -0,0 +1,27 @@ +/* +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.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; +public class Sql_order_clause { + private final List_adp list = List_adp_.new_(); + private Sql_order_fld[] ary; + public void Flds__add(Sql_order_fld fld) {list.Add(fld);} + public Sql_order_fld[] Flds() { + if (ary == null) ary = (Sql_order_fld[])list.To_ary_and_clear(Sql_order_fld.class); + return ary; + } +} diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_order_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_clause.java similarity index 85% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_order_itm.java rename to 140_dbs/src/gplx/dbs/sqls/itms/Sql_select_clause.java index c3c213b1a..a503c1694 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_order_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_clause.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.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; -public class Sql_order_itm { - public Sql_order_itm(Sql_order_fld[] flds) {this.Flds = flds;} - public final Sql_order_fld[] Flds; +public class Sql_select_clause { + public boolean Distinct = false; + public final Sql_select_fld_list Flds = new Sql_select_fld_list(); } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld.java index a085bfdfd..1c8955b8a 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld.java @@ -21,37 +21,40 @@ public abstract class Sql_select_fld { public Sql_select_fld(String tbl, String fld, String alias) { this.Tbl = tbl; this.Fld = fld; this.Alias = alias; } - public final String Tbl; - public final String Fld; - public final String Alias; - public abstract String To_sql(); + public final String Tbl; // tbl_alias; EX: "t1." + public final String Fld; // fld_key; EX: "fld" + public final String Alias; // alias; EX: " AS [Field Name]"; NOTE: must be fld name if no alias defined; EX: "SELECT fld1" should have tbl='', fld='fld1' and alias='fld1' + public abstract String To_fld_sql(); // EX: "t1.fld AS [Field Name]" + public String To_fld_alias() {return Alias;} // EX: "t1.fld AS [Field Name]" -> "Field Name"; "t1.fld1" -> "fld1" + public String To_fld_key() {return Tbl == Tbl__null ? Fld : Tbl + "." + Fld;} - public static final String Tbl_null = null; + public static final String Tbl__null = null, Fld__wildcard = "*"; public static Sql_select_fld New_fld (String tbl, String fld, String alias) {return new Sql_select_fld_col(tbl, fld, alias);} + public static Sql_select_fld Wildcard = Sql_select_fld_wild.Instance; public static Sql_select_fld New_count (String tbl, String fld, String alias) {return new Sql_select_fld_count(tbl, fld, alias);} public static Sql_select_fld New_sum (String tbl, String fld, String alias) {return new Sql_select_fld_sum(tbl, fld, alias);} public static Sql_select_fld New_min (String tbl, String fld, String alias) {return new Sql_select_fld_minMax(CompareAble_.Less, tbl, fld, alias);} public static Sql_select_fld New_max (String tbl, String fld, String alias) {return new Sql_select_fld_minMax(CompareAble_.More, tbl, fld, alias);} + public static String Bld_tbl_w_fld(String tbl, String fld) {return tbl == null ? fld : tbl + "." + fld;} // tdb related functions public ClassXtn Val_type() {return val_type;} public void Val_type_(ClassXtn val) {val_type = val;} private ClassXtn val_type = ObjectClassXtn.Instance; public abstract Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type); @gplx.Virtual public void GroupBy_type(ClassXtn type) {this.Val_type_(type);} } -class Sql_select_fld_wild extends Sql_select_fld { Sql_select_fld_wild() {super(Tbl_null, Fld_wildcard, Fld_wildcard);} - @Override public String To_sql() {return Fld_wildcard;} +class Sql_select_fld_wild extends Sql_select_fld { Sql_select_fld_wild() {super(Sql_select_fld.Tbl__null, Fld__wildcard, Fld__wildcard);} + @Override public String To_fld_sql() {return Fld__wildcard;} public static final Sql_select_fld_wild Instance = new Sql_select_fld_wild(); - public static final String Fld_wildcard = "*"; // tdb-related functions @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {throw Err_.new_wo_type("group by eval not allowed on *");} @Override public void GroupBy_type(ClassXtn type) {throw Err_.new_wo_type("group by type not allowed on *");} } class Sql_select_fld_col extends Sql_select_fld { public Sql_select_fld_col(String tbl, String fld, String alias) {super(tbl, fld, alias);} - @Override public String To_sql() { + @Override public String To_fld_sql() { String rv = Fld; - if (this.Tbl != Tbl_null) + if (this.Tbl != Tbl__null) rv = this.Tbl + "." + Fld; if (!String_.Eq(Alias, Fld)) rv = rv + " AS " + Alias; diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_func.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_func.java index d9394e102..ef071c6ad 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_func.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_func.java @@ -19,7 +19,7 @@ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sq import gplx.core.type_xtns.*; abstract class Sql_select_fld_func extends Sql_select_fld { public Sql_select_fld_func(String tbl, String fld, String alias) {super(tbl, fld, alias);} public abstract String XtoSql_functionName(); - @Override public String To_sql() { + @Override public String To_fld_sql() { return String_.Format("{0}({1}) AS {2}", XtoSql_functionName(), Fld, Alias); } } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_list.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_list.java index 08b554fea..f0ca153a6 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_list.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_select_fld_list.java @@ -18,7 +18,8 @@ along with this program. If not, see . package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; public class Sql_select_fld_list { private final Ordered_hash hash = Ordered_hash_.New(); - public int Len() {return hash.Count();} - public Sql_select_fld Get_at(int i) {return (Sql_select_fld)hash.Get_at(i);} - public void Add(Sql_select_fld fld) {hash.Add(fld.Alias, fld);} + public int Len() {return hash.Count();} + public Sql_select_fld_list Clear() {hash.Clear();return this;} + public Sql_select_fld Get_at(int i) {return (Sql_select_fld)hash.Get_at(i);} + public void Add(Sql_select_fld fld) {hash.Add(fld.Alias, fld);} } diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_tbl_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_tbl_itm.java index d6bc10c8e..ec1a792e9 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_tbl_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_tbl_itm.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; public class Sql_tbl_itm { - public Sql_tbl_itm(int join_tid, String db, String name, String alias, Sql_join_itm[] join_flds) { + public Sql_tbl_itm(int join_tid, String db, String name, String alias, Sql_join_fld[] join_flds) { this.Join_tid = join_tid; this.Db = db; this.Name = name; @@ -28,7 +28,8 @@ public class Sql_tbl_itm { public final String Db; public final String Name; public final String Alias; - public final Sql_join_itm[] Join_flds; + public boolean Db_enabled = true; + public final Sql_join_fld[] Join_flds; public static final String Alias__null = String_.Null; public static final String Db__null = String_.Null; diff --git a/140_dbs/src/gplx/dbs/sqls/itms/Sql_where_itm.java b/140_dbs/src/gplx/dbs/sqls/itms/Sql_where_clause.java similarity index 89% rename from 140_dbs/src/gplx/dbs/sqls/itms/Sql_where_itm.java rename to 140_dbs/src/gplx/dbs/sqls/itms/Sql_where_clause.java index 1fb3f3f07..24aaa717d 100644 --- a/140_dbs/src/gplx/dbs/sqls/itms/Sql_where_itm.java +++ b/140_dbs/src/gplx/dbs/sqls/itms/Sql_where_clause.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; import gplx.core.criterias.*; -public class Sql_where_itm { +public class Sql_where_clause { public Criteria Root = Criteria_.All; public static final Object Where__null = null; - public static final Sql_where_itm All = new Sql_where_itm(); + public static final Sql_where_clause All = new Sql_where_clause(); } diff --git a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_core_wtr.java b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_core_wtr.java index 725b14f9e..a1d44c7e5 100644 --- a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_core_wtr.java +++ b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_core_wtr.java @@ -68,13 +68,13 @@ public class Sql_core_wtr implements Sql_qry_wtr { int last = arg_count - 1; bfr.Add_str_u8_many("INSERT INTO ", qry.Base_table(), " ("); for (int i = 0; i < arg_count; i++) { - KeyVal pair = qry.Args().Get_at(i); + Keyval pair = qry.Args().Get_at(i); this.Bld_col_name(bfr, pair.Key()); bfr.Add_str_a7(i == last ? ")" : ", "); } bfr.Add_str_a7(" VALUES ("); for (int i = 0; i < arg_count; i++) { - KeyVal pair = qry.Args().Get_at(i); + Keyval pair = qry.Args().Get_at(i); Db_arg arg = (Db_arg)pair.Val(); val_wtr.Bld_val(bfr, ctx, arg.Val); bfr.Add_str_a7(i == last ? ")" : ", "); @@ -85,7 +85,7 @@ public class Sql_core_wtr implements Sql_qry_wtr { int arg_count = qry.Args().Count(); if (arg_count == 0) throw Err_.new_wo_type("Db_qry_update has no columns", "base_table", qry.Base_table()); bfr.Add_str_u8_many("UPDATE ", qry.Base_table(), " SET "); for (int i = 0; i < arg_count; i++) { - KeyVal pair = qry.Args().Get_at(i); + Keyval pair = qry.Args().Get_at(i); if (i > 0) bfr.Add_str_a7(", "); this.Bld_col_name(bfr, pair.Key()); bfr.Add_str_a7("="); diff --git a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_from_wtr.java b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_from_wtr.java index 61b948341..fb5fd4659 100644 --- a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_from_wtr.java +++ b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_from_wtr.java @@ -18,20 +18,20 @@ along with this program. If not, see . package gplx.dbs.sqls.wtrs; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*; import gplx.dbs.sqls.itms.*; public class Sql_from_wtr { - public void Bld_clause_from(Bry_bfr bfr, Sql_from_itm from) { + public void Bld_clause_from(Bry_bfr bfr, Sql_from_clause from) { List_adp tbls = from.Tbls; int tbls_len = tbls.Count(); for (int i = 0; i < tbls_len; ++i) { Sql_tbl_itm tbl = (Sql_tbl_itm)tbls.Get_at(i); bfr.Add_byte_space().Add_str_a7(Bld_join(tbl.Join_tid)).Add_byte_space(); - if (tbl.Db != Sql_tbl_itm.Db__null) + if (tbl.Db != Sql_tbl_itm.Db__null && tbl.Db_enabled) bfr.Add_str_u8(tbl.Db).Add_byte_dot(); bfr.Add_str_u8(tbl.Name); if (tbl.Alias != Sql_tbl_itm.Alias__null) bfr.Add_byte_space().Add_str_u8(tbl.Alias); String tbl_alias = tbl.Alias == null ? tbl.Name : tbl.Alias; - Sql_join_itm[] flds = tbl.Join_flds; int flds_len = flds.length; + Sql_join_fld[] flds = tbl.Join_flds; int flds_len = flds.length; for (int j = 0; j < flds_len; ++j) { - Sql_join_itm join_fld = flds[j]; + Sql_join_fld join_fld = flds[j]; bfr.Add_str_a7(j == 0 ? " ON " : " AND "); bfr.Add_str_u8(join_fld.Src_tbl).Add_byte_dot().Add_str_u8(join_fld.Src_fld); bfr.Add(Bry__join_eq); diff --git a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_schema_wtr.java b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_schema_wtr.java index 1194cc935..cb417dacd 100644 --- a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_schema_wtr.java +++ b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_schema_wtr.java @@ -34,6 +34,7 @@ public class Sql_schema_wtr { int flds_len = flds.length; for (int i = 0; i < flds_len; ++i) { Dbmeta_idx_fld fld = flds[i]; + if (fld == null) continue; // fld will be null when tbl has Dbmetafld.Key_null (to support obsoleted schemas) if (i != 0) tmp_bfr.Add_str_a7(", "); tmp_bfr.Add_str_a7(fld.Name); } diff --git a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_select_wtr.java b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_select_wtr.java index fe7f5d90c..1d793842a 100644 --- a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_select_wtr.java +++ b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_select_wtr.java @@ -29,7 +29,7 @@ public class Sql_select_wtr { for (int i = 0; i < flds_len; i++) { Sql_select_fld fld = (Sql_select_fld)flds.Get_at(i); if (i > 0) bfr.Add_str_a7(", "); - qry_wtr.Bld_col_name(bfr, fld.To_sql()); + qry_wtr.Bld_col_name(bfr, fld.To_fld_sql()); } qry_wtr.From_wtr().Bld_clause_from(bfr, qry.From()); Bld_indexed_by(bfr, ctx, qry, qry.Indexed_by()); @@ -40,7 +40,7 @@ public class Sql_select_wtr { if (qry.Offset() != Db_qry__select_cmd.Offset__disabled) Bld_offset(bfr, ctx, qry, qry.Offset()); } - private void Bld_select_group_by(Bry_bfr bfr, Sql_wtr_ctx ctx, Db_qry__select_cmd qry, Sql_group_itm groupBy) { + private void Bld_select_group_by(Bry_bfr bfr, Sql_wtr_ctx ctx, Db_qry__select_cmd qry, Sql_group_clause groupBy) { if (groupBy == null) return; bfr.Add_str_a7(" GROUP BY "); for (int i = 0; i < groupBy.Flds().Count(); i++) { @@ -49,12 +49,12 @@ public class Sql_select_wtr { bfr.Add_str_a7(item); } } - private void Bld_select_order_by(Bry_bfr bfr, Sql_wtr_ctx ctx, Db_qry__select_cmd qry, Sql_order_itm orderBy) { + private void Bld_select_order_by(Bry_bfr bfr, Sql_wtr_ctx ctx, Db_qry__select_cmd qry, Sql_order_clause orderBy) { if (orderBy == null) return; bfr.Add_str_a7(" ORDER BY "); - int len = orderBy.Flds.length; + int len = orderBy.Flds().length; for (int i = 0; i < len; ++i) { - Sql_order_fld item = orderBy.Flds[i]; + Sql_order_fld item = orderBy.Flds()[i]; if (i > 0) bfr.Add_str_a7(", "); bfr.Add_str_a7(item.To_sql()); } diff --git a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_where_wtr.java b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_where_wtr.java index 0536e3368..991db7c1c 100644 --- a/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_where_wtr.java +++ b/140_dbs/src/gplx/dbs/sqls/wtrs/Sql_where_wtr.java @@ -21,8 +21,8 @@ public class Sql_where_wtr { private final Sql_core_wtr qry_wtr; private final Sql_val_wtr val_wtr; public Sql_where_wtr(Sql_core_wtr qry_wtr, Sql_val_wtr val_wtr) {this.qry_wtr = qry_wtr; this.val_wtr = val_wtr;} - public void Bld_where(Bry_bfr bfr, Sql_wtr_ctx ctx, Sql_where_itm where_itm) { - if (where_itm == Sql_where_itm.Where__null) return; + public void Bld_where(Bry_bfr bfr, Sql_wtr_ctx ctx, Sql_where_clause where_itm) { + if (where_itm == Sql_where_clause.Where__null) return; Bld_where(bfr, ctx, where_itm.Root); } public void Bld_where(Bry_bfr bfr, Sql_wtr_ctx ctx, Criteria crt) { diff --git a/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg.java b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg.java new file mode 100644 index 000000000..d360f1d0d --- /dev/null +++ b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg.java @@ -0,0 +1,25 @@ +/* +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.dbs.stmts; import gplx.*; import gplx.dbs.*; +public class Db_stmt_arg { + public Db_stmt_arg(boolean crt, int tid, String key, Object val) {this.Crt = crt; this.Tid = tid; this.Key = key; this.Val = val;} + public final boolean Crt; + public final int Tid; + public final String Key; + public Object Val; +} diff --git a/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java new file mode 100644 index 000000000..a0c46d758 --- /dev/null +++ b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java @@ -0,0 +1,65 @@ +/* +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.dbs.stmts; import gplx.*; import gplx.dbs.*; +public class Db_stmt_arg_list { + private final List_adp list = List_adp_.new_(); + public void Clear() {list.Clear();} + public int Len() {return list.Len();} + public Db_stmt_arg Get_at(int i) {return (Db_stmt_arg)list.Get_at(i);} + public Db_stmt_arg_list Crt_int (String key, int val) {return Add(Bool_.Y, Dbmeta_fld_tid.Tid__int, key, val);} + public Db_stmt_arg_list Crt_str_by_bry (String key, byte[] val) {return Add(Bool_.Y, Dbmeta_fld_tid.Tid__str, key, String_.new_u8(val));} + public Db_stmt_arg_list Crt_str (String key, String val) {return Add(Bool_.Y, Dbmeta_fld_tid.Tid__str, key, val);} + public Db_stmt_arg_list Add(boolean crt, int tid, String key, Object val) {list.Add(new Db_stmt_arg(crt, tid, key, val)); return this;} + public void Fill(Db_stmt stmt) { + int len = list.Len(); + for (int i = 0; i < len; ++i) { + Db_stmt_arg arg = (Db_stmt_arg)list.Get_at(i); + if (arg.Crt) + Fill_crt(stmt, arg.Tid, arg.Key, arg.Val); + else + Fill_val(stmt, arg.Tid, arg.Key, arg.Val); + } + list.Clear(); + } + private static void Fill_crt(Db_stmt stmt, int tid, String key, Object val) { + switch (tid) { + case Dbmeta_fld_tid.Tid__bool: stmt.Crt_bool_as_byte (key, Bool_.cast(val)); break; + case Dbmeta_fld_tid.Tid__byte: stmt.Crt_byte (key, Byte_.cast(val)); break; + case Dbmeta_fld_tid.Tid__int: stmt.Crt_int (key, Int_.cast(val)); break; + case Dbmeta_fld_tid.Tid__long: stmt.Crt_long (key, Long_.cast(val)); break; + case Dbmeta_fld_tid.Tid__float: stmt.Crt_float (key, Float_.cast(val)); break; + case Dbmeta_fld_tid.Tid__double: stmt.Crt_double (key, Double_.cast(val)); break; + case Dbmeta_fld_tid.Tid__str: stmt.Crt_str (key, String_.cast(val)); break; + case Dbmeta_fld_tid.Tid__bry: stmt.Crt_bry (key, Bry_.cast(val)); break; + default: throw Err_.new_unhandled_default(tid); + } + } + private static void Fill_val(Db_stmt stmt, int tid, String key, Object val) { + switch (tid) { + case Dbmeta_fld_tid.Tid__bool: stmt.Val_bool_as_byte (key, Bool_.cast(val)); break; + case Dbmeta_fld_tid.Tid__byte: stmt.Val_byte (key, Byte_.cast(val)); break; + case Dbmeta_fld_tid.Tid__int: stmt.Val_int (key, Int_.cast(val)); break; + case Dbmeta_fld_tid.Tid__long: stmt.Val_long (key, Long_.cast(val)); break; + case Dbmeta_fld_tid.Tid__float: stmt.Val_float (key, Float_.cast(val)); break; + case Dbmeta_fld_tid.Tid__double: stmt.Val_double (key, Double_.cast(val)); break; + case Dbmeta_fld_tid.Tid__str: stmt.Val_str (key, String_.cast(val)); break; + case Dbmeta_fld_tid.Tid__bry: stmt.Val_bry (key, Bry_.cast(val)); break; + default: throw Err_.new_unhandled_default(tid); + } + } +} diff --git a/140_dbs/src/gplx/dbs/stmts/Db_stmt_mgr.java b/140_dbs/src/gplx/dbs/stmts/Db_stmt_mgr.java new file mode 100644 index 000000000..a9658a43f --- /dev/null +++ b/140_dbs/src/gplx/dbs/stmts/Db_stmt_mgr.java @@ -0,0 +1,53 @@ +/* +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.dbs.stmts; import gplx.*; import gplx.dbs.*; +public class Db_stmt_mgr { + private final List_adp fmt_list = List_adp_.new_(); + private final Db_stmt_arg_list arg_list = new Db_stmt_arg_list(); + public boolean Mode_is_stmt() {return mode_is_stmt;} public Db_stmt_mgr Mode_is_stmt_(boolean v) {mode_is_stmt = v; return this;} private boolean mode_is_stmt = true; + public void Clear() {arg_list.Clear(); fmt_list.Clear(); bfr.Clear();} + public Bry_bfr Bfr() {return bfr;} private final Bry_bfr bfr = Bry_bfr.new_(); + public void Add_var_many(Object... ary) { + for (Object o : ary) + fmt_list.Add(o); + } + public void Add_crt_str(String key, String val) { + fmt_list.Add(mode_is_stmt ? stmt_arg_placeholder : gplx.dbs.sqls.Sql_qry_wtr_.Quote_arg(val)); + arg_list.Add(Bool_.Y, Dbmeta_fld_tid.Tid__str, key, val); + } + public void Add_crt_int(String key, int val) { + fmt_list.Add(mode_is_stmt ? stmt_arg_placeholder : Int_.To_str(val)); + arg_list.Add(Bool_.Y, Dbmeta_fld_tid.Tid__int, key, val); + } + public void Write_fmt(Bry_fmt fmt) { + fmt.Bld_many(bfr, (Object[])fmt_list.To_ary_and_clear(Object.class)); + } + public String Make_sql(Bry_fmt fmt) { // should only be called publicly for debugging purposes + Write_fmt(fmt); + return bfr.To_str_and_clear(); + } + public Db_stmt Make_stmt(Db_conn conn, Bry_fmt fmt) { + return conn.Stmt_sql(Make_sql(fmt)); + } + public void Fill_stmt_and_clear(Db_stmt stmt) { + stmt.Clear(); + arg_list.Fill(stmt); + fmt_list.Clear(); // NOTE: also clear fmt_list, since Fill_stmt can be called without calling Make_sql / Make_stmt + } + private static final String stmt_arg_placeholder = "?"; +} diff --git a/140_dbs/src/gplx/dbs/sys/Db_sys_tbl.java b/140_dbs/src/gplx/dbs/sys/Db_sys_tbl.java index 94b86504f..d193f4734 100644 --- a/140_dbs/src/gplx/dbs/sys/Db_sys_tbl.java +++ b/140_dbs/src/gplx/dbs/sys/Db_sys_tbl.java @@ -27,7 +27,7 @@ class Db_sys_tbl implements Rls_able { conn.Rls_reg(this); } public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public int Assert_int_or(String key, int or) { String rv = Assert_str_or(key, Int_.To_str(or)); try {return Int_.parse(rv);} diff --git a/140_dbs/tst/gplx/dbs/engines/db_CrudOps_tst.java b/140_dbs/tst/gplx/dbs/engines/db_CrudOps_tst.java index 3cb8c6fb7..5561e4668 100644 --- a/140_dbs/tst/gplx/dbs/engines/db_CrudOps_tst.java +++ b/140_dbs/tst/gplx/dbs/engines/db_CrudOps_tst.java @@ -60,7 +60,7 @@ class CrudOpsFxt { fx.tst_ExecDml(1, Db_qry_.insert_("dbs_crud_ops").Val_int("id", 1).Val_str("name", "John Doe")); fx.tst_ExecDml(1, Db_qry_.insert_("dbs_crud_ops").Val_int("id", 2).Val_str("name", "John Doe")); - fx.tst_ExecDml(1, Db_qry_.update_common_("dbs_crud_ops", Db_crt_.New_eq("id", 2), KeyVal_.new_("name", "Jane Smith"))); + fx.tst_ExecDml(1, Db_qry_.update_common_("dbs_crud_ops", Db_crt_.New_eq("id", 2), Keyval_.new_("name", "Jane Smith"))); fx.tst_ExecRdrTbl(2, "dbs_crud_ops"); fx.tst_RowAry(0, 1, "John Doe"); fx.tst_RowAry(1, 2, "Jane Smith"); @@ -70,7 +70,7 @@ class CrudOpsFxt { fx.tst_ExecDml(1, Db_qry_.insert_("dbs_crud_ops").Val_int("id", 1).Val_str("name", "John Doe")); fx.tst_ExecDml(1, Db_qry_.insert_("dbs_crud_ops").Val_int("id", 2).Val_str("name", "John Doe")); - fx.tst_ExecDml(2, Db_qry_.update_common_("dbs_crud_ops", Db_crt_.New_eq("name", "John Doe"), KeyVal_.new_("name", "Jane Smith"))); + fx.tst_ExecDml(2, Db_qry_.update_common_("dbs_crud_ops", Db_crt_.New_eq("name", "John Doe"), Keyval_.new_("name", "Jane Smith"))); fx.tst_ExecRdrTbl(2, "dbs_crud_ops"); fx.tst_RowAry(0, 1, "Jane Smith"); fx.tst_RowAry(1, 2, "Jane Smith"); diff --git a/140_dbs/xtn/gplx/dbs/Bug_Utf8.java b/140_dbs/xtn/gplx/dbs/Bug_Utf8.java index 716efedaf..2ab7e347e 100644 --- a/140_dbs/xtn/gplx/dbs/Bug_Utf8.java +++ b/140_dbs/xtn/gplx/dbs/Bug_Utf8.java @@ -16,6 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; +import gplx.String_; + import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -122,36 +124,53 @@ IDE: Eclipse 20090920-1017 (not that it should matter) import java.sql.*; public class Bug_Utf8 { - public static void main(String[] args) throws Exception { - Class.forName("org.sqlite.JDBC"); - Connection conn = - DriverManager.getConnection("jdbc:sqlite:test.db"); - Statement stat = conn.createStatement(); - stat.executeUpdate("drop table if exists people;"); - stat.executeUpdate("create table people (name, occupation);"); - PreparedStatement prep = conn.prepareStatement( - "insert into people values (?, ?);"); - - prep.setString(1, "Gandhi"); - prep.setString(2, "politics"); - prep.addBatch(); - prep.setString(1, "Turing"); - prep.setString(2, "computers"); - prep.addBatch(); - prep.setString(1, "Wittgenstein"); - prep.setString(2, "smartypants"); - prep.addBatch(); - - conn.setAutoCommit(false); - prep.executeBatch(); - conn.setAutoCommit(true); + public static void main(String[] args) throws Exception { + Like(); + } + public static void Utf8() throws Exception { + Class.forName("org.sqlite.JDBC"); + Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db"); + Statement stat = conn.createStatement(); + stat.executeUpdate("drop table if exists people;"); + stat.executeUpdate("create table people (name, occupation);"); + PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);"); + + prep.setString(1, "Gandhi"); + prep.setString(2, "politics"); + prep.addBatch(); + prep.setString(1, "Turing"); + prep.setString(2, "computers"); + prep.addBatch(); + prep.setString(1, "Wittgenstein"); + prep.setString(2, "smartypants"); + prep.addBatch(); + + conn.setAutoCommit(false); + prep.executeBatch(); + conn.setAutoCommit(true); + + ResultSet rs = stat.executeQuery("select * from people;"); + while (rs.next()) { + System.out.println("name = " + rs.getString("name")); + System.out.println("job = " + rs.getString("occupation")); + } + rs.close(); + conn.close(); + } + private static void Like() throws Exception { + Class.forName("org.sqlite.JDBC"); + Connection conn = DriverManager.getConnection("jdbc:sqlite:C:/xowa/wiki/en.wikipedia.org/en.wikipedia.org-xtn.search.link-title-ns.000-db.001.xowa"); + conn.createStatement().execute("ATTACH DATABASE 'C:\\xowa\\wiki\\en.wikipedia.org\\en.wikipedia.org-core.xowa' AS page_db"); + conn.createStatement().execute("ATTACH DATABASE 'C:\\xowa\\wiki\\en.wikipedia.org\\en.wikipedia.org-xtn.search.core.xowa' AS word_db"); - ResultSet rs = stat.executeQuery("select * from people;"); - while (rs.next()) { - System.out.println("name = " + rs.getString("name")); - System.out.println("job = " + rs.getString("occupation")); - } - rs.close(); - conn.close(); - } + String sql = "SELECT * FROM word_db.search_word INDEXED BY temp WHERE word_text LIKE 'bug%' AND link_score_max > 0 AND link_score_min < 1000000 LIMIT 1"; + PreparedStatement stat = conn.prepareStatement(sql); + + ResultSet rs = stat.executeQuery(); + while (rs.next()) { + System.out.println(rs.getObject(1).toString()); + } + rs.close(); + conn.close(); + } } \ No newline at end of file diff --git a/150_gfui/.project b/150_gfui/.project deleted file mode 100644 index 00ed7787a..000000000 --- a/150_gfui/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 150_gfui - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/150_gfui/lib/swt-gtk-3.8.jar b/150_gfui/lib/swt-gtk-3.8.jar deleted file mode 100644 index c24c3aa4e..000000000 Binary files a/150_gfui/lib/swt-gtk-3.8.jar and /dev/null differ diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java index ff9ddec7b..1416cbfbf 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java @@ -25,10 +25,10 @@ public class IptBnd_txt_range implements InjectAble, GfoInvkAble, GfoEvObj { this.getListCmd = getListCmd; this.getCmd = getCmd; this.setCmd = setCmd; this.setEvt = setEvt; return this; } String getListCmd, getCmd, setCmd, setEvt; - public IptBnd_txt_range PropList_(KeyVal[] list) { + public IptBnd_txt_range PropList_(Keyval[] list) { this.list = list; return this; - } KeyVal[] list = null; + } Keyval[] list = null; public void Inject(Object owner) { txtBox = GfuiTextBox_.cast(owner); txtBox.TextAlignH_center_(); @@ -67,7 +67,7 @@ public class IptBnd_txt_range implements InjectAble, GfoInvkAble, GfoEvObj { } void ReadyEvtCmd() { if (getListCmd != null) - list = (KeyVal[])GfoInvkAble_.InvkCmd(propInvk, getListCmd); + list = (Keyval[])GfoInvkAble_.InvkCmd(propInvk, getListCmd); Object curId = GfoInvkAble_.InvkCmd(propInvk, getCmd); WhenEvtCmd(curId); } diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java index a126437a9..68931968b 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java @@ -21,7 +21,7 @@ import gplx.core.primitives.*; import gplx.core.stores.*; import gplx.core.bits. public class IptKey_ { private static EnmMgr enm_mgr = EnmMgr.new_().BitRngBgn_(65536).BitRngEnd_(262144).Prefix_("key."); public static IptKey[] Ary(IptKey... ary) {return ary;} - public static final IptKey[] Ary_empty = new IptKey[0]; + public static final IptKey[] Ary_empty = new IptKey[0]; public static IptKey as_(Object obj) {return obj instanceof IptKey ? (IptKey)obj : null;} public static IptKey cast(Object obj) {try {return (IptKey)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, IptKey.class, obj);}} public static IptKey add_(IptKey... ary) { @@ -68,7 +68,7 @@ public class IptKey_ { return rv; } public static final int KeyCode_Shift = 65536, KeyCode_Ctrl = 131072, KeyCode_Alt = 262144; - public static final IptKey + public static final IptKey None = new_(0, "none") , Back = new_(8, "back"), Tab = new_(9, "tab"), Clear = new_(12, "clear"), Enter = new_(KeyEvent.VK_ENTER, "enter") , ShiftKey = new_(16, "shiftKey"), CtrlKey = new_(17, "ctrlKey"), AltKey = new_(18, "altKey") diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox.java b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox.java index 823d0a92a..1f00117ee 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox.java @@ -17,6 +17,18 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public interface GxwComboBox extends GxwElem { - void DataSource_set(Object... ary); + int SelBgn(); void SelBgn_set(int v); + int SelLen(); void SelLen_set(int v); + void Sel_(int bgn, int end); Object SelectedItm(); void SelectedItm_set(Object v); + String[] DataSource_as_str_ary(); + void DataSource_set(Object... ary); + String Text_fallback(); void Text_fallback_(String v); + int List_sel_idx(); void List_sel_idx_(int v); + boolean List_visible(); void List_visible_(boolean v); + void Items__update(String[] ary); + void Items__size_to_fit(int count); + void Items__visible_rows_(int v); + void Items__jump_len_(int v); + void Margins_set(int left, int top, int right, int bot); } diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java index 33e8c1182..942341c97 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java @@ -21,6 +21,7 @@ import java.awt.event.*; import javax.swing.*; public class GxwComboBox_lang extends JComboBox implements GxwComboBox, GxwElem, ActionListener { + public String[] DataSource_as_str_ary() {return String_.Ary_empty;} public void DataSource_set(Object... ary) { for (Object o : ary) this.insertItemAt(o, this.getItemCount()); @@ -33,9 +34,20 @@ public class GxwComboBox_lang extends JComboBox implements GxwComboBox, GxwElem, obj = cb.getSelectedItem(); */ } + public int SelBgn() {return -1;} public void SelBgn_set(int v) {} + public int SelLen() {return 0;} public void SelLen_set(int v) {} + public void Sel_(int bgn, int end) {} public Object SelectedItm() {return this.getEditor().getItem();} public void SelectedItm_set(Object v) { this.getEditor().setItem(v); } + @Override public String Text_fallback() {return "";} @Override public void Text_fallback_(String v) {} + @Override public int List_sel_idx() {return -1;} @Override public void List_sel_idx_(int v) {} + public boolean List_visible() {return false;} public void List_visible_(boolean v) {} + public void Items__update(String[] ary) {} + public void Items__size_to_fit(int count) {} + public void Items__visible_rows_(int v) {} + public void Items__jump_len_(int v) {} + public void Margins_set(int left, int top, int right, int bot) {} void ctor_() { ctrlMgr = GxwCore_lang.new_(this); this.enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK); diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwElemFactory_base.java b/150_gfui/src_300_gxw/gplx/gfui/GxwElemFactory_base.java index 91429831e..db81065e2 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwElemFactory_base.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwElemFactory_base.java @@ -19,13 +19,13 @@ package gplx.gfui; import gplx.*; public abstract class GxwElemFactory_base { @gplx.Internal protected abstract GxwElem control_(); @gplx.Internal protected abstract GxwWin win_app_(); - @gplx.Internal protected abstract GxwWin win_tool_(KeyValHash ctorArgs); - @gplx.Internal protected abstract GxwWin win_toaster_(KeyValHash ctorArgs); + @gplx.Internal protected abstract GxwWin win_tool_(Keyval_hash ctorArgs); + @gplx.Internal protected abstract GxwWin win_toaster_(Keyval_hash ctorArgs); @gplx.Internal protected abstract GxwElem lbl_(); @gplx.Internal protected abstract GxwTextFld text_fld_(); @gplx.Internal protected abstract GxwTextFld text_memo_(); @gplx.Internal protected abstract GxwTextHtml text_html_(); - @gplx.Internal protected abstract GxwCheckListBox checkListBox_(KeyValHash ctorArgs); + @gplx.Internal protected abstract GxwCheckListBox checkListBox_(Keyval_hash ctorArgs); @gplx.Internal protected abstract GxwComboBox comboBox_(); @gplx.Internal protected abstract GxwListBox listBox_(); // @gplx.Internal protected GxwElem spacer_() {return MockControl.new_();} @@ -37,15 +37,15 @@ class GxwElemFactory_ { } class GxwElemFactory_cls_lang extends GxwElemFactory_base { @gplx.Internal @Override protected GxwElem control_() {return new GxwElem_lang();} - @gplx.Internal @Override protected GxwWin win_tool_(KeyValHash ctorArgs) { - GfuiWin ownerForm = (GfuiWin)ctorArgs.FetchValOr(GfuiElem_.InitKey_ownerWin, null); + @gplx.Internal @Override protected GxwWin win_tool_(Keyval_hash ctorArgs) { + GfuiWin ownerForm = (GfuiWin)ctorArgs.Get_val_or(GfuiElem_.InitKey_ownerWin, null); GxwWin ownerElem = ownerForm == null ? null : (GxwWin)ownerForm.UnderElem(); return GxwWin_jdialog.new_(ownerElem); // return GxwWin_lang.new_(); } - @gplx.Internal @Override protected GxwWin win_toaster_(KeyValHash ctorArgs) { + @gplx.Internal @Override protected GxwWin win_toaster_(Keyval_hash ctorArgs) { GfsCtx ctx = GfsCtx.new_(); ctx.Match("", ""); - GfuiWin ownerForm = (GfuiWin)ctorArgs.FetchValOr(GfuiElem_.InitKey_ownerWin, null); + GfuiWin ownerForm = (GfuiWin)ctorArgs.Get_val_or(GfuiElem_.InitKey_ownerWin, null); GxwWin ownerElem = ownerForm == null ? null : (GxwWin)ownerForm.UnderElem(); return GxwWin_jwindow.new_(ownerElem); // return GxwWin_lang.new_(); @@ -55,20 +55,20 @@ class GxwElemFactory_cls_lang extends GxwElemFactory_base { @gplx.Internal @Override protected GxwTextFld text_fld_() {return GxwTextBox_lang_.fld_();} @gplx.Internal @Override protected GxwTextFld text_memo_() {return GxwTextBox_lang_.memo_();} @gplx.Internal @Override protected GxwTextHtml text_html_() {return new GxwTextHtml_lang().ctor();} - @gplx.Internal @Override protected GxwCheckListBox checkListBox_(KeyValHash ctorArgs) {return new GxwCheckListBox_lang();} + @gplx.Internal @Override protected GxwCheckListBox checkListBox_(Keyval_hash ctorArgs) {return new GxwCheckListBox_lang();} @gplx.Internal @Override protected GxwComboBox comboBox_() {return GxwComboBox_lang.new_();} @gplx.Internal @Override protected GxwListBox listBox_() {return GxwListBox_lang.new_();} } class GxwElemFactory_cls_mock extends GxwElemFactory_base { @gplx.Internal @Override protected GxwElem control_() {return GxwElem_mock_base.new_();} @gplx.Internal @Override protected GxwWin win_app_() {return MockForm.Instance;} - @gplx.Internal @Override protected GxwWin win_tool_(KeyValHash ctorArgs) {return MockForm.Instance;} - @gplx.Internal @Override protected GxwWin win_toaster_(KeyValHash ctorArgs) {return MockForm.Instance;} + @gplx.Internal @Override protected GxwWin win_tool_(Keyval_hash ctorArgs) {return MockForm.Instance;} + @gplx.Internal @Override protected GxwWin win_toaster_(Keyval_hash ctorArgs) {return MockForm.Instance;} @gplx.Internal @Override protected GxwElem lbl_() {return GxwElem_mock_base.new_();} @gplx.Internal @Override protected GxwTextFld text_fld_() {return new MockTextBox();} @gplx.Internal @Override protected GxwTextFld text_memo_() {return new MockTextBoxMulti();} @gplx.Internal @Override protected GxwTextHtml text_html_() {return new MockTextBoxMulti();} - @gplx.Internal @Override protected GxwCheckListBox checkListBox_(KeyValHash ctorArgs) {throw Err_.new_unimplemented();} + @gplx.Internal @Override protected GxwCheckListBox checkListBox_(Keyval_hash ctorArgs) {throw Err_.new_unimplemented();} @gplx.Internal @Override protected GxwComboBox comboBox_() {return new MockComboBox();} @gplx.Internal @Override protected GxwListBox listBox_() {return new MockListBox();} } diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwElem_mock_base.java b/150_gfui/src_300_gxw/gplx/gfui/GxwElem_mock_base.java index 51855a243..ad2e85faa 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwElem_mock_base.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwElem_mock_base.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public class GxwElem_mock_base implements GxwElem { - public GxwCore_base Core() {return ctrlMgr;} final GxwCore_mock ctrlMgr = new GxwCore_mock(); + public GxwCore_base Core() {return ctrlMgr;} final GxwCore_mock ctrlMgr = new GxwCore_mock(); public GxwCbkHost Host() {return host;} public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host = GxwCbkHost_.Null; public String TextVal() {return text;} public void TextVal_set(String v) {text = v;} private String text = ""; public void SendKeyDown(IptKey key) {} @@ -38,7 +38,7 @@ class MockTextBox extends GxwElem_mock_base implements GxwTextFld { public void CreateControlIfNeeded() {} public void Margins_set(int left, int top, int right, int bot) {} } -class MockTextBoxMulti extends MockTextBox implements GxwTextMemo, GxwTextHtml { public KeyVal[] Html_sel_atrs() {return KeyVal_.Ary_empty;} +class MockTextBoxMulti extends MockTextBox implements GxwTextMemo, GxwTextHtml { public Keyval[] Html_sel_atrs() {return Keyval_.Ary_empty;} public void Html_enabled(boolean v) {} public String Html_doc_html() {return "";} public void Html_css_set(String s) {} @@ -62,7 +62,19 @@ class MockTextBoxMulti extends MockTextBox implements GxwTextMemo, GxwTextHtml { public void ScrollTillCaretIsVisible() {} } class MockComboBox extends GxwElem_mock_base implements GxwComboBox { + public int SelBgn() {return -1;} public void SelBgn_set(int v) {} + public int SelLen() {return 0;} public void SelLen_set(int v) {} + public void Sel_(int bgn, int end) {} + public String[] DataSource_as_str_ary() {return String_.Ary_empty;} public void DataSource_set(Object... ary) {} + public String Text_fallback() {return "";} public void Text_fallback_(String v) {} + public int List_sel_idx() {return -1;} public void List_sel_idx_(int v) {} + public boolean List_visible() {return false;} public void List_visible_(boolean v) {} + public void Items__update(String[] ary) {} + public void Items__size_to_fit(int count) {} + public void Items__visible_rows_(int v) {} + public void Items__jump_len_(int v) {} + public void Margins_set(int left, int top, int right, int bot) {} public Object SelectedItm() {return selectedItm;} public void SelectedItm_set(Object v) {this.selectedItm = v;} Object selectedItm; } class MockListBox extends GxwElem_mock_base implements GxwListBox { diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml.java b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml.java index 1b3e94f53..5e54e238e 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; interface GxwTextHtml extends GxwTextMemo { - KeyVal[] Html_sel_atrs(); + Keyval[] Html_sel_atrs(); void Html_enabled(boolean v); String Html_doc_html(); void Html_css_set(String s); diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java index ee84848d1..62ccee2f5 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java @@ -97,7 +97,7 @@ public class GxwTextHtml_lang extends JScrollPane implements GxwTextHtml { this.setBorder(null); return this; } - public KeyVal[] Html_sel_atrs() {return editor.Html_sel_atrs();} + public Keyval[] Html_sel_atrs() {return editor.Html_sel_atrs();} public String Html_doc_html() {return editor.Html_doc_html();} public void Html_css_set(String s) {editor.Html_css_set(s);} @Override public void Margins_set(int left, int top, int right, int bot) {} @@ -162,9 +162,9 @@ class GxwTextHtml_editor extends JEditorPane implements GxwTextHtml { sb.Add("selBgn=").Add(Int_.To_str(Html_sel_bgn())).Add_char_crlf(); sb.Add("selEnd=").Add(Int_.To_str(Html_sel_end())).Add_char_crlf(); sb.Add("selTxt=").Add(Html_sel_text()).Add_char_crlf(); - KeyVal[] atrs = Html_sel_atrs(); + Keyval[] atrs = Html_sel_atrs(); for (int i = 0; i < atrs.length; i++) { - KeyVal atr = atrs[i]; + Keyval atr = atrs[i]; sb.Add(atr.Key() + "=").Add(atr.Val_to_str_or_null()).Add_char_crlf(); } return sb.To_str(); @@ -208,15 +208,15 @@ class GxwTextHtml_editor extends JEditorPane implements GxwTextHtml { if (atr_val instanceof javax.swing.text.AttributeSet) Html_sel_atrs((AttributeSet)atr_val, list, itm_key, dlm); else - list.Add(KeyVal_.new_(itm_key, atr_val)); + list.Add(Keyval_.new_(itm_key, atr_val)); } } - public KeyVal[] Html_sel_atrs() { - if (String_.Eq(this.getContentType(), "text/plain")) return KeyVal_.Ary_empty; - Element elm = Html_sel_elm(); if (elm == null) return KeyVal_.Ary_empty; + public Keyval[] Html_sel_atrs() { + if (String_.Eq(this.getContentType(), "text/plain")) return Keyval_.Ary_empty; + Element elm = Html_sel_elm(); if (elm == null) return Keyval_.Ary_empty; List_adp sel_atrs_list = List_adp_.new_(); Html_sel_atrs(elm.getAttributes(), sel_atrs_list, null, "."); - return (KeyVal[])sel_atrs_list.To_ary(KeyVal.class); + return (Keyval[])sel_atrs_list.To_ary(Keyval.class); } @Override public void processKeyEvent(KeyEvent e) { diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwWin_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwWin_lang.java index c6eaa54bf..0a00a2b58 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwWin_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwWin_lang.java @@ -252,17 +252,17 @@ class GxwElemFactory_swt extends GxwElemFactory_base { @gplx.Internal @Override protected GxwWin win_app_() { return new Swt_win(display); } -@gplx.Internal @Override protected GxwWin win_tool_(KeyValHash ctorArgs) { +@gplx.Internal @Override protected GxwWin win_tool_(Keyval_hash ctorArgs) { return null; } -@gplx.Internal @Override protected GxwWin win_toaster_(KeyValHash ctorArgs) { +@gplx.Internal @Override protected GxwWin win_toaster_(Keyval_hash ctorArgs) { return null; } @gplx.Internal @Override protected GxwElem lbl_() {return null;} @gplx.Internal @Override protected GxwTextFld text_fld_() {return null;} @gplx.Internal @Override protected GxwTextFld text_memo_() {return null;} @gplx.Internal @Override protected GxwTextHtml text_html_() {return null;} -@gplx.Internal @Override protected GxwCheckListBox checkListBox_(KeyValHash ctorArgs) {throw Err_.new_unimplemented();} +@gplx.Internal @Override protected GxwCheckListBox checkListBox_(Keyval_hash ctorArgs) {throw Err_.new_unimplemented();} @gplx.Internal @Override protected GxwComboBox comboBox_() {return null;} @gplx.Internal @Override protected GxwListBox listBox_() {return null;} } diff --git a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html_load_tid_.java b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html_load_tid_.java index f616b8e9e..0a1d09f61 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html_load_tid_.java +++ b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html_load_tid_.java @@ -31,5 +31,5 @@ public class Gxw_html_load_tid_ { else if (String_.Eq(s, Key_url)) return Tid_url; else throw Err_.new_unimplemented(); } - public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_(Key_mem), KeyVal_.new_(Key_url)); + public static Keyval[] Options__list = Keyval_.Ary(Keyval_.new_(Key_mem), Keyval_.new_(Key_url)); } diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiWin.java b/150_gfui/src_400_win/gplx/gfui/GfuiWin.java index db49bdbbb..7ec79dcd4 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiWin.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiWin.java @@ -40,7 +40,7 @@ public class GfuiWin extends GfuiElemBase { smallOpenSize = size; return this; } private SizeAdp smallOpenSize = SizeAdp_.Null; - @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); win = (GxwWin)underElem; win.OpenedCmd_set(GfoInvkAbleCmd.new_(this, Evt_Opened)); @@ -51,7 +51,7 @@ public class GfuiWin extends GfuiElemBase { loadList.Add(keyCmdMgr); loadList.Add(GfuiTipTextMgr.Instance); focusMgr = GfuiWinFocusMgr.new_(this); } - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); win = (GxwWin)this.UnderElem(); win.OpenedCmd_set(GfoInvkAbleCmd.new_(this, Evt_Opened)); @@ -62,8 +62,8 @@ public class GfuiWin extends GfuiElemBase { loadList.Add(keyCmdMgr); loadList.Add(GfuiTipTextMgr.Instance); focusMgr = GfuiWinFocusMgr.new_(this); } - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) { - String type = (String)ctorArgs.FetchValOr(GfuiWin_.InitKey_winType, GfuiWin_.InitKey_winType_app); + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) { + String type = (String)ctorArgs.Get_val_or(GfuiWin_.InitKey_winType, GfuiWin_.InitKey_winType_app); if (String_.Eq(type, GfuiWin_.InitKey_winType_tool)) return GxwElemFactory_.Instance.win_tool_(ctorArgs); else if (String_.Eq(type, GfuiWin_.InitKey_winType_toaster)) return GxwElemFactory_.Instance.win_toaster_(ctorArgs); else return GxwElemFactory_.Instance.win_app_(); diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiWin_.java b/150_gfui/src_400_win/gplx/gfui/GfuiWin_.java index 74efe429d..168578274 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiWin_.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiWin_.java @@ -25,15 +25,15 @@ public class GfuiWin_ { ; public static GfuiWin as_(Object obj) {return obj instanceof GfuiWin ? (GfuiWin)obj : null;} public static GfuiWin cast(Object obj) {try {return (GfuiWin)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, GfuiWin.class, obj);}} - public static GfuiWin app_(String key) {return bld_(key, InitKey_winType_app, KeyValHash.new_());} - public static GfuiWin tool_(String key) {return bld_(key, InitKey_winType_tool, KeyValHash.new_()).TaskbarVisible_(false);} + public static GfuiWin app_(String key) {return bld_(key, InitKey_winType_app, new Keyval_hash());} + public static GfuiWin tool_(String key) {return bld_(key, InitKey_winType_tool, new Keyval_hash()).TaskbarVisible_(false);} public static GfuiWin sub_(String key, GfuiWin ownerWin) { - KeyValHash ctorArgs = KeyValHash.new_(); + Keyval_hash ctorArgs = new Keyval_hash(); if (ownerWin != null) ctorArgs.Add(GfuiElem_.InitKey_ownerWin, ownerWin); // WORKAROUND/JAVA: null ownerWin will fail when adding to hash return bld_(key, InitKey_winType_tool, ctorArgs); } - public static GfuiWin toaster_(String key, GfuiWin ownerWin) {return bld_(key, InitKey_winType_toaster, KeyValHash.new_().Add(GfuiElem_.InitKey_ownerWin, ownerWin));} - static GfuiWin bld_(String key, String winType, KeyValHash ctorArgs) { + public static GfuiWin toaster_(String key, GfuiWin ownerWin) {return bld_(key, InitKey_winType_toaster, new Keyval_hash().Add(GfuiElem_.InitKey_ownerWin, ownerWin));} + static GfuiWin bld_(String key, String winType, Keyval_hash ctorArgs) { GfuiWin rv = new GfuiWin(); rv.Key_of_GfuiElem_(key); ctorArgs.Add(InitKey_winType, winType) @@ -41,7 +41,7 @@ public class GfuiWin_ { rv.ctor_GfuiBox_base(ctorArgs); return rv; } - public static GfuiWin kit_(Gfui_kit kit, String key, GxwWin under, KeyValHash ctorArgs) { + public static GfuiWin kit_(Gfui_kit kit, String key, GxwWin under, Keyval_hash ctorArgs) { GfuiWin rv = new GfuiWin(); rv.ctor_kit_GfuiElemBase(kit, key, under, ctorArgs); return rv; diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiWin_toaster.java b/150_gfui/src_400_win/gplx/gfui/GfuiWin_toaster.java index 4acc01dc9..9d7b6519e 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiWin_toaster.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiWin_toaster.java @@ -125,9 +125,9 @@ public class GfuiWin_toaster extends GfuiWin { public void ShowPopup(GfuiWin own this.Pos_(this.X(), PopupAnchorTop); //this.Top - increment this.Size_(SizeAdp_.new_(this.Width(), this.Height() + increment)); } - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.win_toaster_(ctorArgs);} + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.win_toaster_(ctorArgs);} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.fullyGrown = SizeAdp_.new_(600, 96); this.Pos_(-100, -100); this.Size_(fullyGrown); super.Show(); super.Hide();// was 20,20; set to fullyGrown b/c of java @@ -161,7 +161,7 @@ public class GfuiWin_toaster extends GfuiWin { public void ShowPopup(GfuiWin own GfuiWin_toaster rv = new GfuiWin_toaster(); // rv.Icon_(IconAdp.cfg_("popup")); rv.ctor_GfuiBox_base - (KeyValHash.new_() + (new Keyval_hash() .Add(GfuiElem_.InitKey_focusAble, false) .Add(GfuiElem_.InitKey_ownerWin, owner) .Add(GfuiWin_.InitKey_winType, GfuiWin_.InitKey_winType_toaster) diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java index 1a458a293..46f2e43e6 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java @@ -70,7 +70,7 @@ public interface GfuiElem extends GfoInvkAble, GxwCbkHost, IptBndsOwner, GftItem //% Infrastructure GxwElem UnderElem(); - GxwElem UnderElem_make(KeyValHash ctorArgs); - void ctor_GfuiBox_base(KeyValHash ctorArgs); + GxwElem UnderElem_make(Keyval_hash ctorArgs); + void ctor_GfuiBox_base(Keyval_hash ctorArgs); void Invoke(GfoInvkAbleCmd cmd); } diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java index a375e9b9d..0657763eb 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java @@ -261,17 +261,17 @@ public class GfuiElemBase implements GfuiElem { } public Gfui_kit Kit() {return kit;} private Gfui_kit kit = Gfui_kit_.Mem(); - @gplx.Virtual public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @gplx.Virtual public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { this.kit = Swing_kit.Instance; // NOTE: assume that callers want Swing; SWT / Mem should be calling ctor_kit_GfuiElemBase underElem = UnderElem_make(ctorArgs); underElem.Host_set(this); underMgr = underElem.Core(); subElems = GfuiElemList.new_(this); textMgr = GfxStringData.new_(this, underElem); - this.Focus_able_(Bool_.cast(ctorArgs.FetchValOr(GfuiElem_.InitKey_focusAble, true))); + this.Focus_able_(Bool_.cast(ctorArgs.Get_val_or(GfuiElem_.InitKey_focusAble, true))); underMgr.Size_set(SizeAdp_.new_(20, 20)); // NOTE: CS inits to 20,20; JAVA inits to 0,0 } - @gplx.Virtual public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @gplx.Virtual public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { this.kit = kit; this.keyIdf = key; this.underElem = underElem; @@ -279,10 +279,10 @@ public class GfuiElemBase implements GfuiElem { underMgr = underElem.Core(); subElems = GfuiElemList.new_(this); textMgr = GfxStringData.new_(this, underElem); - this.Focus_able_(Bool_.cast(ctorArgs.FetchValOr(GfuiElem_.InitKey_focusAble, true))); + this.Focus_able_(Bool_.cast(ctorArgs.Get_val_or(GfuiElem_.InitKey_focusAble, true))); // underMgr.Size_set(SizeAdp_.new_(20, 20)); // NOTE: CS inits to 20,20; JAVA inits to 0,0 } - @gplx.Virtual public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.control_();} + @gplx.Virtual public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.control_();} public Object SubItms_getObj(String key) {return injected.Get_by(key);} public GfuiElemBase SubItms_add(String key, Object v) {injected.Add(key, v); return this;} public Ordered_hash XtnAtrs() {return xtnAtrs;} Ordered_hash xtnAtrs = Ordered_hash_.New(); diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem_.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem_.java index 99d1619f5..dd60c95f2 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem_.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem_.java @@ -32,8 +32,8 @@ public class GfuiElem_ { rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_true_()); return rv; } - public static KeyValHash init_focusAble_true_() {return KeyValHash.new_().Add(GfuiElem_.InitKey_focusAble, true);} - public static KeyValHash init_focusAble_false_() {return KeyValHash.new_().Add(GfuiElem_.InitKey_focusAble, false);} + public static Keyval_hash init_focusAble_true_() {return new Keyval_hash().Add(GfuiElem_.InitKey_focusAble, true);} + public static Keyval_hash init_focusAble_false_() {return new Keyval_hash().Add(GfuiElem_.InitKey_focusAble, false);} public static void Y_adj(int adj, GfuiElem... ary) { int len = ary.length; for (int i = 0; i < len; i++) { diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java index d3e13f3ad..71662724d 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn.java @@ -35,8 +35,8 @@ public class GfuiBtn extends GfuiElemBase { Object o = GfoInvkAble_.InvkCmd(UnderElem(), Invk_btn_img); return o == UnderElem() ? null : (ImageAdp)o; // NOTE: lgc guard } public GfuiBtn Btn_img_(ImageAdp v) {GfoInvkAble_.InvkCmd_val(UnderElem(), Invk_btn_img_, v); return this;} - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.control_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.control_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { focusBorder = GfuiBorderMgr.new_().All_(PenAdp_.new_(ColorAdp_.Gray, 1)); super.ctor_GfuiBox_base(ctorArgs); this.TextMgr().AlignH_(GfuiAlign_.Mid); @@ -46,7 +46,7 @@ public class GfuiBtn extends GfuiElemBase { Inject_(GfuiFocusXferBnd.Instance); this.CustomDraw_set(true); } - @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { this.kit = kit; super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); focusBorder = GfuiBorderMgr.new_().All_(PenAdp_.new_(ColorAdp_.Gray, 1)); diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn_.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn_.java index 4d1f97969..38ea3a62a 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn_.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtn_.java @@ -30,7 +30,7 @@ public class GfuiBtn_ { rv.Click_invk(GfoInvkAbleCmd.new_(invk, m)); return rv; } - public static GfuiBtn kit_(Gfui_kit kit, String key, GxwElem elm, KeyValHash ctorArgs) { + public static GfuiBtn kit_(Gfui_kit kit, String key, GxwElem elm, Keyval_hash ctorArgs) { GfuiBtn rv = new GfuiBtn(); rv.ctor_kit_GfuiElemBase(kit, key, elm, ctorArgs); return rv; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiChkBox.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiChkBox.java index 36996daba..da4d52def 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiChkBox.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiChkBox.java @@ -51,8 +51,8 @@ public class GfuiChkBox extends GfuiElemBase { } @Override public boolean FocusGotCbk() {super.FocusGotCbk(); this.Redraw(); return true;} // Redraw for focusBorder @Override public boolean FocusLostCbk() {super.FocusLostCbk(); this.Redraw(); return true;} // Redraw for focusBorder - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); focusBorder.All_(PenAdp_.new_(ColorAdp_.Gray, 1)); Inject_(GfuiFocusXferBnd.Instance).Inject_(GfuiBtnClickBnd.Instance); diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiComboBox.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiComboBox.java index 74c086759..4561fa2a9 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiComboBox.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiComboBox.java @@ -17,18 +17,42 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public class GfuiComboBox extends GfuiElemBase { - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.comboBox_();} GxwComboBox comboBox; - public Object SelectedItm() {return comboBox.SelectedItm();} public void SelectedItm_set(Object v) {comboBox.SelectedItm_set(v);} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); - this.comboBox = (GxwComboBox)this.UnderElem(); - } - public void DataSource_set(Object... ary) { - comboBox.DataSource_set(ary); + this.combo = (GxwComboBox)this.UnderElem(); } + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.comboBox_();} private GxwComboBox combo; + public int SelBgn() {return combo.SelBgn();} public void SelBgn_set(int v) {combo.SelBgn_set(v); GfoEvMgr_.Pub(this, Evt__selection_start_changed);} + public int SelLen() {return combo.SelLen();} public void SelLen_set(int v) {combo.SelLen_set(v);} + public void Sel_(int bgn, int len) {combo.Sel_(bgn, len);} + public Object SelectedItm() {return combo.SelectedItm();} public void SelectedItm_set(Object v) {combo.SelectedItm_set(v);} + public String[] DataSource_as_str_ary() {return combo.DataSource_as_str_ary();} + public void DataSource_set(Object... ary) {combo.DataSource_set(ary);} + public String Text_fallback() {return combo.Text_fallback();} + public void Text_fallback_(String v) {combo.Text_fallback_(v);} + public int List_sel_idx() {return combo.List_sel_idx();} + public void List_sel_idx_(int v) {combo.List_sel_idx_(v);} + public boolean List_visible() {return combo.List_visible();} + public void List_visible_(boolean v) {combo.List_visible_(v);} + public void Items__update(String[] ary) {combo.Items__update(ary);} + public void Items__size_to_fit(int len) {combo.Items__size_to_fit(len);} + public void Items__visible_rows_(int v) {combo.Items__visible_rows_(v);} + public void Items__jump_len_(int v) {combo.Items__jump_len_(v);} + public void Margins_set(int left, int top, int right, int bot) {combo.Margins_set(left, top, right, bot);} public static GfuiComboBox new_() { GfuiComboBox rv = new GfuiComboBox(); rv.ctor_GfuiBox_base(GfuiElem_.init_focusAble_true_()); return rv; } + public static GfuiComboBox kit_(Gfui_kit kit, String key, GxwElem elm, Keyval_hash ctorArgs) { + GfuiComboBox rv = new GfuiComboBox(); + rv.ctor_kit_GfuiElemBase(kit, key, elm, ctorArgs); + rv.combo = (GxwComboBox)elm; + return rv; + } + public static final String + Evt__selected_changed = "Selected_changed" + , Evt__selected_accepted = "Selected_accepted" + , Evt__selection_start_changed = "SelectionStartChanged" + ; } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java index 44ac1fd07..8a751cc7a 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl.java @@ -27,13 +27,13 @@ public class GfuiLbl extends GfuiElemBase { // standard label does not support t this.TextMgr().DrawData(args.Graphics()); return true; } - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.CustomDraw_set(true); } - @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); this.CustomDraw_set(true); } - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java index 4a292359b..0c5f244eb 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiLbl_.java @@ -23,7 +23,7 @@ public class GfuiLbl_ { rv.TextMgr().AlignH_(GfuiAlign_.Mid); return rv; } - public static GfuiLbl kit_(Gfui_kit kit, String key, GxwElem elm, KeyValHash ctorArgs) { + public static GfuiLbl kit_(Gfui_kit kit, String key, GxwElem elm, Keyval_hash ctorArgs) { GfuiLbl rv = new GfuiLbl(); rv.ctor_kit_GfuiElemBase(kit, key, elm, ctorArgs); return rv; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiListBox.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiListBox.java index 170f93e45..e51c42b51 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiListBox.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiListBox.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.gfui; import gplx.*; import gplx.core.lists.*; /*EnumerAble*/ public class GfuiListBox extends GfuiElemBase { - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.listBox_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.listBox_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.listBox = (GxwListBox)UnderElem(); } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox.java index 0aa85c53f..0675d8de8 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox.java @@ -54,12 +54,12 @@ public class GfuiTextBox extends GfuiElemBase { @gplx.Internal protected void SetTextBox(GxwTextFld textBox) {this.textBox = textBox;} @gplx.Internal protected void CreateControlIfNeeded() {textBox.CreateControlIfNeeded();} - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.text_fld_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.text_fld_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); textBox = (GxwTextFld)this.UnderElem(); } GxwTextFld textBox; - @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); textBox = (GxwTextFld)underElem; } diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox_.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox_.java index 6b4b7097d..3a347627d 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox_.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextBox_.java @@ -38,7 +38,7 @@ public class GfuiTextBox_ { rv.Key_of_GfuiElem_(key).Owner_(owner); return rv; } - public static GfuiTextBox kit_(Gfui_kit kit, String key, GxwTextFld wk_textBox, KeyValHash ctorArgs) { + public static GfuiTextBox kit_(Gfui_kit kit, String key, GxwTextFld wk_textBox, Keyval_hash ctorArgs) { GfuiTextBox rv = new GfuiTextBox(); rv.ctor_kit_GfuiElemBase(kit, key, wk_textBox, ctorArgs); return rv; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextMemo.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextMemo.java index 40a6948bb..88029ad51 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextMemo.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiTextMemo.java @@ -32,8 +32,8 @@ public class GfuiTextMemo extends GfuiTextBox { public int LinesPerScreen() {re public void SelectionStart_toFirstChar() {textBox.SelectionStart_toFirstChar(); GfoEvMgr_.Pub(this, SelectionStartChanged_evt);} public void ScrollTillSelectionStartIsFirstLine() {textBox.ScrollTillSelectionStartIsFirstLine();} - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.text_memo_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.text_memo_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); textBox = (GxwTextMemo)UnderElem(); this.SetTextBox(textBox); 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 c552b87ff..96cad3b91 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 @@ -33,7 +33,7 @@ public class Gfui_html extends GfuiElemBase { this.Html_doc_html_load_by_mem(v); return this; } - public static Gfui_html kit_(Gfui_kit kit, String key, Gxw_html under, KeyValHash ctorArgs) { + public static Gfui_html kit_(Gfui_kit kit, String key, Gxw_html under, Keyval_hash ctorArgs) { Gfui_html rv = new Gfui_html(); rv.ctor_kit_GfuiElemBase(kit, key, (GxwElem)under, ctorArgs); rv.under = under; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_itm.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_itm.java index afd23e7d3..a033d44cb 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_itm.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_itm.java @@ -21,7 +21,7 @@ public class Gfui_tab_itm extends GfuiElemBase { public String Tab_name() {return under.Tab_name();} public void Tab_name_(String v) {under.Tab_name_(v);} public String Tab_tip_text() {return under.Tab_tip_text();} public void Tab_tip_text_(String v) {under.Tab_tip_text_(v);} public void Subs_add(GfuiElem elem) {under.Subs_add(elem);} - public static Gfui_tab_itm kit_(Gfui_kit kit, String key, Gxw_tab_itm under, KeyValHash ctor_args) { + public static Gfui_tab_itm kit_(Gfui_kit kit, String key, Gxw_tab_itm under, Keyval_hash ctor_args) { Gfui_tab_itm rv = new Gfui_tab_itm(); // rv.ctor_kit_GfuiElemBase(kit, key, (GxwElem)under, ctor_args); // causes swt_tab_itm to break, since it's not a real Swt Control rv.under = under; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_mgr.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_mgr.java index 9be9f8c5b..3ee31e179 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_mgr.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_tab_mgr.java @@ -22,7 +22,7 @@ public class Gfui_tab_mgr extends GfuiElemBase { public ColorAdp Btns_unselected_color() {return under.Btns_unselected_color();} public void Btns_unselected_color_(ColorAdp v) {under.Btns_unselected_color_(v);} public Gfui_tab_itm Tabs_add(Gfui_tab_itm_data tab_data) { Gxw_tab_itm tab_itm = under.Tabs_add(tab_data); - return Gfui_tab_itm.kit_(this.Kit(), tab_data.Key(), tab_itm, KeyValHash.Empty); + return Gfui_tab_itm.kit_(this.Kit(), tab_data.Key(), tab_itm, new Keyval_hash()); } public int Btns_height() {return under.Btns_height();} public void Btns_height_(int v) {under.Btns_height_(v);} public boolean Btns_place_on_top() {return under.Btns_place_on_top();} public void Btns_place_on_top_(boolean v) {under.Btns_place_on_top_(v);} @@ -32,7 +32,7 @@ public class Gfui_tab_mgr extends GfuiElemBase { public void Tabs_select_by_idx(int idx) {under.Tabs_select_by_idx(idx);} public void Tabs_close_by_idx(int idx) {under.Tabs_close_by_idx(idx);} public void Tabs_switch(int src, int trg) {under.Tabs_switch(src, trg);} - public static Gfui_tab_mgr kit_(Gfui_kit kit, String key, Gxw_tab_mgr under, KeyValHash ctor_args) { + public static Gfui_tab_mgr kit_(Gfui_kit kit, String key, Gxw_tab_mgr under, Keyval_hash ctor_args) { Gfui_tab_mgr rv = new Gfui_tab_mgr(); rv.ctor_kit_GfuiElemBase(kit, key, (GxwElem)under, ctor_args); rv.under = under; diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListBox.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListBox.java index fbda648ce..4ec85d0fc 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListBox.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListBox.java @@ -28,8 +28,8 @@ public class GfuiCheckListBox extends GfuiElemBase { public List_adp Items_getChecked() {return checkListBox.Items_getChecked();} GxwCheckListBox checkListBox; - @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return new GxwCheckListBox_lang();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return new GxwCheckListBox_lang();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.checkListBox = (GxwCheckListBox)UnderElem(); } diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListPanel.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListPanel.java index 44d475b64..5d88ef952 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListPanel.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiCheckListPanel.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public class GfuiCheckListPanel extends GfuiElemBase { - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); InitToggleWidget(); InitReverseWidget(); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiFormPanel.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiFormPanel.java index 64a1a9f0d..dabf3496a 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiFormPanel.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiFormPanel.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public class GfuiFormPanel extends GfuiElemBase { - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.Width_(60); // default to 60; do not force callers to always set width - GfuiWin ownerForm = (GfuiWin)ctorArgs.FetchValOr(GfuiElem_.InitKey_ownerWin, null); + GfuiWin ownerForm = (GfuiWin)ctorArgs.Get_val_or(GfuiElem_.InitKey_ownerWin, null); GfoFactory_gfui.Btn_MoveBox(this, ownerForm); GfoFactory_gfui.Btn_MinWin2(this); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiIoUrlSelectBox.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiIoUrlSelectBox.java index 2ec269a58..d86096c45 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiIoUrlSelectBox.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiIoUrlSelectBox.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public abstract class GfuiIoUrlSelectBox extends GfuiElemBase { - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); label = GfuiLbl_.sub_("label", this); pathBox.Owner_(this, "pathBox"); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBtn.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBtn.java index 99a813622..887e15b7a 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBtn.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBtn.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -public class GfuiMoveElemBtn extends GfuiBtn { @Override public GxwElem UnderElem_make(KeyValHash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { +public class GfuiMoveElemBtn extends GfuiBtn { @Override public GxwElem UnderElem_make(Keyval_hash ctorArgs) {return GxwElemFactory_.Instance.lbl_();} + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.Text_("*"); this.TipText_("move/resize"); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBar.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBar.java index db675cd39..f23be298e 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBar.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBar.java @@ -29,7 +29,7 @@ public class GfuiStatusBar extends GfuiElemBase { else return super.Invk(ctx, ikey, k, m); return this; } public static final String StatusBarFocus_cmd = "StatusBarFocus"; - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); moveBtn = GfuiMoveElemBtn.new_(); statusBox = GfuiStatusBox_.new_("statusBox"); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java index 73b50d891..2d69bacfc 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java @@ -68,14 +68,14 @@ public class GfuiStatusBox extends GfuiTextBox implements UsrMsgWkr { public Gf return this; } static final String Invk_HideWindow = "HideWindow", Invk_WriteText = "WriteText", Invk_Text_empty = "Text_empty"; TimerAdp timer; - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); this.Border_on_(false); this.Focus_able_(false); this.Visible_set(false); timer = TimerAdp.new_(this, Invk_HideWindow, 2000, false); } - @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + @Override public void ctor_kit_GfuiElemBase(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); this.Border_on_(false); this.Focus_able_(false); @@ -83,7 +83,7 @@ public class GfuiStatusBox extends GfuiTextBox implements UsrMsgWkr { public Gf timerCmd = kit.New_cmd_sync(this); timer = TimerAdp.new_(timerCmd, GfuiInvkCmd_.Invk_sync, 2000, false); } GfuiInvkCmd timerCmd; - public void ctor_kit_GfuiElemBase_drd(Gfui_kit kit, String key, GxwElem underElem, KeyValHash ctorArgs) { + public void ctor_kit_GfuiElemBase_drd(Gfui_kit kit, String key, GxwElem underElem, Keyval_hash ctorArgs) { super.ctor_kit_GfuiElemBase(kit, key, underElem, ctorArgs); this.Border_on_(false); this.Focus_able_(false); diff --git a/150_gfui/src_500_tab/gplx/gfui/TabBox.java b/150_gfui/src_500_tab/gplx/gfui/TabBox.java index 70be61c56..f013bc001 100644 --- a/150_gfui/src_500_tab/gplx/gfui/TabBox.java +++ b/150_gfui/src_500_tab/gplx/gfui/TabBox.java @@ -44,7 +44,7 @@ public class TabBox extends GfuiElemBase { else return super.Invk(GfsCtx.Instance, 0, k, m); return this; } - @Override public void ctor_GfuiBox_base(KeyValHash ctorArgs) { + @Override public void ctor_GfuiBox_base(Keyval_hash ctorArgs) { super.ctor_GfuiBox_base(ctorArgs); btnBox = TabBtnAreaMgr.new_("btnBox", this); pnlBox = TabPnlAreaMgr.new_("pnlBox", this); diff --git a/150_gfui/src_500_tab/gplx/gfui/TabBoxEvt_orderChanged.java b/150_gfui/src_500_tab/gplx/gfui/TabBoxEvt_orderChanged.java index 5bee1129b..c75069d27 100644 --- a/150_gfui/src_500_tab/gplx/gfui/TabBoxEvt_orderChanged.java +++ b/150_gfui/src_500_tab/gplx/gfui/TabBoxEvt_orderChanged.java @@ -22,7 +22,7 @@ public class TabBoxEvt_orderChanged { public static final String OrderChanged_evt = "OrderChanged_evt"; public static void Publish(TabBox tabBox, int curIdx, int newIdx) { - GfoEvMgr_.PubVals(tabBox, OrderChanged_evt, KeyVal_.new_("curIdx", curIdx), KeyVal_.new_("newIdx", newIdx)); + GfoEvMgr_.PubVals(tabBox, OrderChanged_evt, Keyval_.new_("curIdx", curIdx), Keyval_.new_("newIdx", newIdx)); } public static TabBoxEvt_orderChanged Handle(GfsCtx ctx, GfoMsg m) { TabBoxEvt_orderChanged rv = new TabBoxEvt_orderChanged(); diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java index cb6c09160..f88ad05f0 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit.java @@ -32,13 +32,14 @@ public interface Gfui_kit extends GfoInvkAble { int Ask_yes_no_cancel(String grp_key, String msg_key, String fmt, Object... args); GfuiInvkCmd New_cmd_sync(GfoInvkAble invk); GfuiInvkCmd New_cmd_async(GfoInvkAble invk); - GfuiWin New_win_app(String key, KeyVal... args); - GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args); - Gfui_html New_html(String key, GfuiElem owner, KeyVal... args); - Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, KeyVal... args); - GfuiTextBox New_text_box(String key, GfuiElem owner, KeyVal... args); - GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args); - GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args); + GfuiWin New_win_app(String key, Keyval... args); + GfuiWin New_win_utl(String key, GfuiWin owner, Keyval... args); + Gfui_html New_html(String key, GfuiElem owner, Keyval... args); + Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, Keyval... args); + GfuiTextBox New_text_box(String key, GfuiElem owner, Keyval... args); + GfuiBtn New_btn(String key, GfuiElem owner, Keyval... args); + GfuiComboBox New_combo(String key, GfuiElem owner, Keyval... args); + GfuiLbl New_lbl(String key, GfuiElem owner, Keyval... args); Gfui_dlg_file New_dlg_file(byte type, String msg); Gfui_dlg_msg New_dlg_msg(String msg); ImageAdp New_img_load(Io_url path); diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java index 2656525b8..27977c763 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_kit_base.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; public abstract class Gfui_kit_base implements Gfui_kit { - private KeyValHash ctor_args = KeyValHash.new_(); + private Keyval_hash ctor_args = new Keyval_hash(); public abstract byte Tid(); public abstract String Key(); public abstract GxwElemFactory_base Factory(); @@ -36,43 +36,48 @@ public abstract class Gfui_kit_base implements Gfui_kit { public void Btn_img_(GfuiBtn btn, IconAdp v) {} public GfuiInvkCmd New_cmd_sync(GfoInvkAble invk) {return new Gfui_kit_cmd_sync(invk);} public GfuiInvkCmd New_cmd_async(GfoInvkAble invk) {return new Gfui_kit_cmd_async(invk);} - public GfuiWin New_win_app(String key, KeyVal... args) { + public GfuiWin New_win_app(String key, Keyval... args) { GfuiWin rv = GfuiWin_.kit_(this, key, this.Factory().win_app_(), ctor_args); main_win = rv; return rv; } - public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) {return GfuiWin_.kit_(this, key, this.Factory().win_tool_(ctor_args), ctor_args);} - @gplx.Virtual public Gfui_html New_html(String key, GfuiElem owner, KeyVal... args) { + public GfuiWin New_win_utl(String key, GfuiWin owner, Keyval... args) {return GfuiWin_.kit_(this, key, this.Factory().win_tool_(ctor_args), ctor_args);} + @gplx.Virtual public Gfui_html New_html(String key, GfuiElem owner, Keyval... args) { Gfui_html rv = Gfui_html.kit_(this, key, this.New_html_impl(), ctor_args); owner.SubElems().Add(rv); return rv; } - public Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, KeyVal... args) { + public Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, Keyval... args) { Gfui_tab_mgr rv = Gfui_tab_mgr.kit_(this, key, this.New_tab_mgr_impl(), ctor_args); owner.SubElems().Add(rv); return rv; } - public Gfui_tab_itm New_tab_itm(String key, Gfui_tab_mgr owner, KeyVal... args) { + public Gfui_tab_itm New_tab_itm(String key, Gfui_tab_mgr owner, Keyval... args) { Gfui_tab_itm rv = Gfui_tab_itm.kit_(this, key, this.New_tab_itm_impl(), ctor_args); owner.SubElems().Add(rv); return rv; } - public GfuiTextBox New_text_box(String key, GfuiElem owner, KeyVal... args) { + public GfuiTextBox New_text_box(String key, GfuiElem owner, Keyval... args) { GfuiTextBox rv = GfuiTextBox_.kit_(this, key, this.Factory().text_fld_(), ctor_args); owner.SubElems().Add(rv); return rv; } - @gplx.Virtual public GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args) { + @gplx.Virtual public GfuiBtn New_btn(String key, GfuiElem owner, Keyval... args) { GfuiBtn rv = GfuiBtn_.kit_(this, key, New_btn_impl(), ctor_args); owner.SubElems().Add(rv); return rv; } - @gplx.Virtual public GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args) { + @gplx.Virtual public GfuiComboBox New_combo(String key, GfuiElem owner, Keyval... args) { + GfuiComboBox rv = GfuiComboBox.kit_(this, key, New_combo_impl(), ctor_args); + owner.SubElems().Add(rv); + return rv; + } + @gplx.Virtual public GfuiLbl New_lbl(String key, GfuiElem owner, Keyval... args) { GfuiLbl rv = GfuiLbl_.kit_(this, key, New_btn_impl(), ctor_args); owner.SubElems().Add(rv); return rv; } - @gplx.Virtual public GfuiStatusBox New_status_box(String key, GfuiElem owner, KeyVal... args) { + @gplx.Virtual public GfuiStatusBox New_status_box(String key, GfuiElem owner, Keyval... args) { GfuiStatusBox rv = GfuiStatusBox_.kit_(this, key, this.Factory().text_memo_()); owner.SubElems().Add(rv); return rv; @@ -82,6 +87,7 @@ public abstract class Gfui_kit_base implements Gfui_kit { protected abstract Gxw_tab_mgr New_tab_mgr_impl(); protected abstract Gxw_tab_itm New_tab_itm_impl(); protected abstract GxwElem New_btn_impl(); + protected abstract GxwElem New_combo_impl(); @gplx.Virtual public Gfui_dlg_file New_dlg_file(byte type, String msg) {return Gfui_dlg_file_.Noop;} @gplx.Virtual public Gfui_dlg_msg New_dlg_msg(String msg) {return Gfui_dlg_msg_.Noop;} @gplx.Virtual public Gfui_mnu_grp New_mnu_popup(String key, GfuiElem owner) {return Gfui_mnu_grp_.Noop;} diff --git a/150_gfui/src_700_env/gplx/gfui/Mem_kit.java b/150_gfui/src_700_env/gplx/gfui/Mem_kit.java index 216bbaea5..2d1e9df3f 100644 --- a/150_gfui/src_700_env/gplx/gfui/Mem_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Mem_kit.java @@ -21,7 +21,7 @@ public class Mem_kit extends Gfui_kit_base { @Override public String Key() {return "mem";} @Override public GxwElemFactory_base Factory() {return factory;} private GxwElemFactory_cls_mock factory = new GxwElemFactory_cls_mock(); public void New_html_impl_prototype_(Gxw_html v) {html_impl_prototype = v;} private Gxw_html html_impl_prototype; - @Override public Gfui_html New_html(String key, GfuiElem owner, KeyVal... args) { + @Override public Gfui_html New_html(String key, GfuiElem owner, Keyval... args) { if (html_impl_prototype == null) return super.New_html(key, owner, args); else { @@ -33,6 +33,7 @@ public class Mem_kit extends Gfui_kit_base { @Override protected Gxw_tab_mgr New_tab_mgr_impl() {return new Mem_tab_mgr();} @Override protected Gxw_tab_itm New_tab_itm_impl() {return new Mem_tab_itm();} @Override protected GxwElem New_btn_impl() {return factory.control_();} + @Override protected GxwElem New_combo_impl() {return factory.comboBox_();} @Override public ImageAdp New_img_load(Io_url url) {return ImageAdp_null.Instance;} public static final Mem_kit Instance = new Mem_kit(); Mem_kit() {} } diff --git a/150_gfui/src_700_env/gplx/gfui/Swing_kit.java b/150_gfui/src_700_env/gplx/gfui/Swing_kit.java index 689012dce..42f06365e 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swing_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swing_kit.java @@ -30,5 +30,6 @@ public class Swing_kit extends Gfui_kit_base { @Override protected Gxw_tab_mgr New_tab_mgr_impl() {return new Mem_tab_mgr();} @Override protected Gxw_tab_itm New_tab_itm_impl() {return new Mem_tab_itm();} @Override protected GxwElem New_btn_impl() {return factory.control_();} + @Override protected GxwElem New_combo_impl() {return factory.control_();} public static final Swing_kit Instance = new Swing_kit(); Swing_kit() {} } diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index 17380eddd..586d28ad8 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -46,7 +46,7 @@ import org.omg.PortableServer.THREAD_POLICY_ID; import gplx.core.threads.*; public class Swt_kit implements Gfui_kit { - private final KeyValHash ctor_args = KeyValHash.new_(); private final KeyValHash ctor_args_null = KeyValHash.new_(); + private final Keyval_hash ctor_args = new Keyval_hash(); private final Keyval_hash ctor_args_null = new Keyval_hash(); private final Hash_adp kit_args = Hash_adp_.new_(); private Swt_msg_wkr_stop msg_wkr_stop; private Gfo_usr_dlg gui_wtr; private String xul_runner_path = null; private final Bry_fmtr ask_fmtr = Bry_fmtr.new_().Fail_when_invalid_escapes_(false); private final Bry_bfr ask_bfr = Bry_bfr.new_(); @@ -80,7 +80,14 @@ public class Swt_kit implements Gfui_kit { shell.open(); Cursor cursor = new Cursor(display, SWT.CURSOR_ARROW); shell.setCursor(cursor); // set cursor to hand else cursor defaults to Hourglass until mouse is moved; DATE: 2014-01-31 + boolean first = true; while (!shell.isDisposed()) { + if (first) { + first = false; +// shell.setMinimized(true); + shell.setActive(); + shell.forceFocus(); + } if (!display.readAndDispatch()) display.sleep(); } @@ -98,9 +105,9 @@ public class Swt_kit implements Gfui_kit { return; } // add kv to widget_cfg_hash; new controls will get properties from cfg_hash - KeyValHash widget_cfg_hash = (KeyValHash)kit_args.Get_by(type); + Keyval_hash widget_cfg_hash = (Keyval_hash)kit_args.Get_by(type); if (widget_cfg_hash == null) { - widget_cfg_hash = KeyValHash.new_(); + widget_cfg_hash = new Keyval_hash(); kit_args.Add(type, widget_cfg_hash); } widget_cfg_hash.Add_if_dupe_use_nth(key, val); @@ -126,31 +133,31 @@ public class Swt_kit implements Gfui_kit { } public GfuiInvkCmd New_cmd_sync (GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.N);} public GfuiInvkCmd New_cmd_async(GfoInvkAble invk) {return new Swt_gui_cmd(this, gui_wtr, display, invk, Bool_.Y);} - public GfuiWin New_win_utl(String key, GfuiWin owner, KeyVal... args) { + public GfuiWin New_win_utl(String key, GfuiWin owner, Keyval... args) { return GfuiWin_.kit_(this, key, new Swt_win(shell), ctor_args_null); } - public GfuiWin New_win_app(String key, KeyVal... args) { + public GfuiWin New_win_app(String key, Keyval... args) { Swt_win win = new Swt_win(display); this.shell = win.UnderShell(); shell.setLayout(null); return GfuiWin_.kit_(this, key, win, ctor_args_null); } - public GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args) { + public GfuiBtn New_btn(String key, GfuiElem owner, Keyval... args) { GfuiBtn rv = GfuiBtn_.kit_(this, key, new Swt_btn_no_border(Swt_control_.cast_or_fail(owner), ctor_args), ctor_args); owner.SubElems().Add(rv); return rv; } - public GfuiLbl New_lbl(String key, GfuiElem owner, KeyVal... args) { + public GfuiLbl New_lbl(String key, GfuiElem owner, Keyval... args) { GfuiLbl rv = GfuiLbl_.kit_(this, key, new Swt_lbl(Swt_control_.cast_or_fail(owner), ctor_args), ctor_args); owner.SubElems().Add(rv); return rv; } - public Gfui_html New_html(String key, GfuiElem owner, KeyVal... args) { + public Gfui_html New_html(String key, GfuiElem owner, Keyval... args) { ctor_args.Clear(); // check cfg for browser type - KeyValHash html_cfg_args = (KeyValHash)kit_args.Get_by(Gfui_kit_.Cfg_HtmlBox); + Keyval_hash html_cfg_args = (Keyval_hash)kit_args.Get_by(Gfui_kit_.Cfg_HtmlBox); if (html_cfg_args != null) { - KeyVal browser_type = html_cfg_args.FetchOrNull(Cfg_Html_BrowserType); + Keyval browser_type = html_cfg_args.Get_kvp_or_null(Cfg_Html_BrowserType); if (browser_type != null) ctor_args.Add(browser_type); } Swt_html swt_html = new Swt_html(this, Swt_control_.cast_or_fail(owner), ctor_args); @@ -160,7 +167,7 @@ public class Swt_kit implements Gfui_kit { swt_html.Delete_elems_(owner, gfui_html); return gfui_html; } - public Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, KeyVal... args) { + public Gfui_tab_mgr New_tab_mgr(String key, GfuiElem owner, Keyval... args) { ctor_args.Clear(); Swt_tab_mgr rv_swt = new Swt_tab_mgr(this, Swt_control_.cast_or_fail(owner), ctor_args); Gfui_tab_mgr rv = Gfui_tab_mgr.kit_(this, key, rv_swt, ctor_args); @@ -168,19 +175,26 @@ public class Swt_kit implements Gfui_kit { rv_swt.EvMgr_(rv.EvMgr()); return rv; } - public GfuiTextBox New_text_box(String key, GfuiElem owner, KeyVal... args) { + public GfuiTextBox New_text_box(String key, GfuiElem owner, Keyval... args) { ctor_args.Clear(); int args_len = args.length; for (int i = 0; i < args_len; i++) ctor_args.Add(args[i]); - boolean border_on = Bool_.cast(ctor_args.FetchValOr(GfuiTextBox.CFG_border_on_, true)); + boolean border_on = Bool_.cast(ctor_args.Get_val_or(GfuiTextBox.CFG_border_on_, true)); GxwTextFld under = new Swt_text_w_border(Swt_control_.cast_or_fail(owner), New_color(border_on ? ColorAdp_.LightGray : ColorAdp_.White), ctor_args); GfuiTextBox rv = GfuiTextBox_.kit_(this, key, under, ctor_args); rv.Owner_(owner); ctor_args.Clear(); return rv; } - public GfuiStatusBox New_status_box(String key, GfuiElem owner, KeyVal... args) { + public GfuiComboBox New_combo(String key, GfuiElem owner, Keyval... args) { + Swt_combo_ctrl rv_swt = new Swt_combo_ctrl(Swt_control_.cast_or_fail(owner), this.New_color(ColorAdp_.LightGray), ctor_args); + GfuiComboBox rv = GfuiComboBox.kit_(this, key, rv_swt, ctor_args); + rv.Owner_(owner); + rv_swt.EvMgr_(rv.EvMgr()); + return rv; + } + public GfuiStatusBox New_status_box(String key, GfuiElem owner, Keyval... args) { ctor_args.Clear(); GfuiStatusBox rv = GfuiStatusBox_.kit_(this, key, new Swt_text(Swt_control_.cast_or_fail(owner), ctor_args)); rv.Owner_(owner); diff --git a/150_gfui/xtn/gplx/gfui/Swt_app_main.java b/150_gfui/xtn/gplx/gfui/Swt_app_main.java index 867e31646..12de696eb 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_app_main.java +++ b/150_gfui/xtn/gplx/gfui/Swt_app_main.java @@ -16,6 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; +import gplx.Byte_ascii; +import gplx.String_; + import org.eclipse.swt.*; import org.eclipse.swt.browser.*; import org.eclipse.swt.custom.*; @@ -23,6 +26,8 @@ import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; @@ -30,8 +35,10 @@ public class Swt_app_main { public static void main(String[] args) { // Drag_drop(); // List_fonts(); -// keystrokes(args); - Permission_denied(); + keystrokes(args); +// Permission_denied(); +// Combo_default(); +// Combo_composite(); } static void Drag_drop() { final Display display = new Display(); @@ -197,4 +204,226 @@ public class Swt_app_main { } display.dispose(); } + public static void Combo_dflt() { + Display display = new Display(); + Shell shell = new Shell(display); + shell.setLayout(new FillLayout()); + + String[] ITEMS = { "A", "B", "C", "D" }; + + final Combo combo = new Combo(shell, SWT.DROP_DOWN); + combo.setItems(ITEMS); + combo.select(2); + + combo.addSelectionListener(new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + System.out.println(combo.getText()); + } + + public void widgetDefaultSelected(SelectionEvent e) { + System.out.println(combo.getText()); + } + }); + combo.addKeyListener(new KeyListener() { + @Override + public void keyReleased(KeyEvent arg0) { + // TODO Auto-generated method stub + } + + @Override + public void keyPressed(KeyEvent arg0) { + System.out.println(combo.getText()); + if (arg0.keyCode == Byte_ascii.Ltr_a) { + combo.setItem(0, "a"); + combo.setListVisible(true); + } + else if (arg0.keyCode == Byte_ascii.Ltr_b) { + combo.setItem(0, "b"); + combo.setListVisible(true); + } + // System.out.println(combo.getText()); + } + }); + + shell.open(); + combo.setListVisible(true); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + display.dispose(); + } + public static void Combo_composite() { + final Display display = new Display(); + final Shell shell = new Shell(display); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.makeColumnsEqualWidth = true; + shell.setLayout(gridLayout); + final Text text = new Text(shell, SWT.BORDER); + text.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + Text text2 = new Text(shell, SWT.BORDER); + text2.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_END)); + shell.pack(); + shell.open(); + + final Shell combo_shell = new Shell(display, SWT.ON_TOP); + combo_shell.setLayout(new FillLayout()); + final Table combo_table = new Table(combo_shell, SWT.SINGLE); + for (int i = 0; i < 5; i++) { + new TableItem(combo_table, SWT.NONE); + } + + text.addListener(SWT.KeyDown, new Listener() { + @Override public void handleEvent(Event event) { + int index = -1; + switch (event.keyCode) { + case SWT.ARROW_DOWN: + if (event.stateMask == SWT.ALT) { + Rectangle text_bounds = display.map(shell, null, text.getBounds()); + combo_shell.setBounds(text_bounds.x, text_bounds.y + text_bounds.height, text_bounds.width, (text_bounds.height - 1) * combo_table.getItems().length); + combo_shell.setVisible(true); + } else { + index = (combo_table.getSelectionIndex() + 1) % combo_table.getItemCount(); + combo_table.setSelection(index); + event.doit = false; + } + break; + case SWT.ARROW_UP: + if (event.stateMask == SWT.ALT) { + combo_shell.setVisible(false); + } else { + index = combo_table.getSelectionIndex() - 1; + if (index < 0) index = combo_table.getItemCount() - 1; + combo_table.setSelection(index); + event.doit = false; + } + break; + case SWT.CR: + if (combo_shell.isVisible() && combo_table.getSelectionIndex() != -1) { + text.setText(combo_table.getSelection()[0].getText()); + combo_shell.setVisible(false); + } + break; + case SWT.ESC: + combo_shell.setVisible(false); + break; + } + } + }); + + text.addListener(SWT.Modify, new Listener() { + @Override public void handleEvent(Event event) { + String string = text.getText(); + if (string.length() == 0) { + combo_shell.setVisible(false); + } else { + TableItem[] items = combo_table.getItems(); + for (int i = 0; i < items.length; i++) { + items[i].setText(string + '-' + i); + } + + Rectangle text_bounds = display.map(shell, null, text.getBounds()); + combo_shell.setBounds(text_bounds.x, text_bounds.y + text_bounds.height, text_bounds.width, (text_bounds.height - 1) * items.length); + combo_shell.setVisible(true); + } + } + }); + + combo_table.addListener(SWT.DefaultSelection, new Listener() { + @Override public void handleEvent(Event arg0) { + text.setText(combo_table.getSelection()[0].getText()); + combo_shell.setVisible(false); + } + }); + + combo_table.addListener(SWT.KeyDown, new Listener() { + @Override public void handleEvent(Event event) { + if (event.keyCode == SWT.ESC) { + combo_shell.setVisible(false); + } + } + }); + + final Swt_shell_hider shell_hider = new Swt_shell_hider(combo_shell); + Listener focus_out_listener = new Listener() { + @Override public void handleEvent(Event arg0) { + if (display.isDisposed()) return; + Control control = display.getFocusControl(); +// if (control == null || (control != text && control != combo_table)) { +// combo_shell.setVisible(false); +// } + if (control == null || (control == text || control == combo_table)) { + // combo_shell.setVisible(false); + shell_hider.Active = true; + display.asyncExec(shell_hider); + //Thread t = new Thread(shell_hider); t.start(); + //Swt_shell_hider + } + +// boolean combo_is_focus = combo_table.isFocusControl(); +// boolean text_is_focus = text.isFocusControl(); +// if (control == null || (control == text)) { +// combo_shell.setVisible(false); +// } +// if (control == null || (control == combo_table)) { +// combo_shell.setVisible(true); +// } + } + }; + + combo_table.addListener(SWT.FocusOut, focus_out_listener); + text.addListener(SWT.FocusOut, focus_out_listener); + + Listener focus_in_listener = new Listener() { + @Override public void handleEvent(Event arg0) { + if (display.isDisposed()) return; + Control control = display.getFocusControl(); + if (control == combo_table) { + // combo_shell.setVisible(false); + //display.asyncExec(shell_hider); + shell_hider.Active = false; + //Swt_shell_hider + } +// boolean combo_is_focus = combo_table.isFocusControl(); +// boolean text_is_focus = text.isFocusControl(); +// if (control == null || (control == text)) { +// combo_shell.setVisible(false); +// } +// if (control == null || (control == combo_table)) { +// combo_shell.setVisible(true); +// } + } + }; + combo_table.addListener(SWT.FocusIn, focus_in_listener); + + shell.addListener(SWT.Move, new Listener() { + @Override public void handleEvent(Event arg0) { + combo_shell.setVisible(false); + } + }); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) display.sleep(); + } + display.dispose(); + } +} +class Swt_shell_hider implements Runnable { + public boolean Active = true; + + private Shell combo_shell; + public Swt_shell_hider(Shell combo_shell) {this.combo_shell = combo_shell;} + @Override public void run() { +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + if (Active) { + combo_shell.setVisible(false); + } + } } diff --git a/150_gfui/xtn/gplx/gfui/Swt_btn.java b/150_gfui/xtn/gplx/gfui/Swt_btn.java index 713f434bd..9585eeb75 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_btn.java +++ b/150_gfui/xtn/gplx/gfui/Swt_btn.java @@ -41,7 +41,7 @@ import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; class Swt_btn implements GxwElem, Swt_control { private Button btn; - public Swt_btn(Swt_control owner, KeyValHash ctorArgs) { + public Swt_btn(Swt_control owner, Keyval_hash ctorArgs) { btn = new Button(owner.Under_composite(), SWT.FLAT | SWT.PUSH); core = new Swt_core_cmds(btn); btn.addKeyListener(new Swt_lnr_key(this)); @@ -58,7 +58,7 @@ class Swt_btn implements GxwElem, Swt_control { } class Swt_btn_no_border implements GxwElem, Swt_control { private ImageAdp btn_img; private Composite box_grp; private Label box_btn; - public Swt_btn_no_border(Swt_control owner_control, KeyValHash ctorArgs) { + public Swt_btn_no_border(Swt_control owner_control, Keyval_hash ctorArgs) { Composite owner = owner_control.Under_composite(); Make_btn_no_border(owner.getDisplay(), owner.getShell(), owner); this.core = new Swt_core_cmds(box_btn); diff --git a/150_gfui/xtn/gplx/gfui/Swt_combo.java b/150_gfui/xtn/gplx/gfui/Swt_combo.java new file mode 100644 index 000000000..53faa917d --- /dev/null +++ b/150_gfui/xtn/gplx/gfui/Swt_combo.java @@ -0,0 +1,99 @@ +/* +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.gfui; + +import gplx.GfoEvMgr; +import gplx.GfoEvMgrOwner; +import gplx.GfoEvMgr_; +import gplx.GfoMsg; +import gplx.GfsCtx; +import gplx.Keyval_hash; +import gplx.String_; +import gplx.Tfds; +import gplx.core.threads.Thread_adp; +import gplx.core.threads.Thread_adp_; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +class Swt_combo implements GxwElem, GxwComboBox, Swt_control, GfoEvMgrOwner { + private final Combo combo; + public Swt_combo(Swt_control owner, Keyval_hash ctorArgs) { + combo = new Combo(owner.Under_composite(), SWT.DROP_DOWN); + core = new Swt_core_cmds(combo); + combo.addKeyListener(new Swt_lnr_key(this)); + combo.addMouseListener(new Swt_lnr_mouse(this)); + combo.addSelectionListener(new Swt_combo__selection_listener(this)); + } + @Override public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr; public void EvMgr_(GfoEvMgr v) {ev_mgr = v;} + @Override public Control Under_control() {return combo;} + @Override public Control Under_menu_control() {return combo;} + @Override public String TextVal() {return combo.getText();} @Override public void TextVal_set(String v) {combo.setText(v);} + @Override public GxwCore_base Core() {return core;} GxwCore_base core; + @Override public GxwCbkHost Host() {return host;} @Override public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host; + @Override public Composite Under_composite() {return null;} + @Override public void EnableDoubleBuffering() {} + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return null;} + @Override public Object SelectedItm() {return null;} + @Override public int SelBgn() {return combo.getSelection().x;} @Override public void SelBgn_set(int v) {combo.setSelection(new Point(combo.getSelection().y, v));} + @Override public int SelLen() {return combo.getSelection().y;} @Override public void SelLen_set(int v) {combo.setSelection(new Point(v, combo.getSelection().x));} + @Override public void Sel_(int bgn, int end) {combo.setSelection(new Point(bgn, end));} + @Override public void SelectedItm_set(Object v) {} + @Override public String[] DataSource_as_str_ary() {return String_.Ary_empty;} + @Override public void DataSource_set(Object... ary) {combo.setItems((String[])ary);} + @Override public String Text_fallback() {return "";} @Override public void Text_fallback_(String v) {} + @Override public int List_sel_idx() {return -1;} @Override public void List_sel_idx_(int v) {} + @Override public void Items__update(String[] ary) {} + @Override public void Items__size_to_fit(int count) {} + @Override public void Items__visible_rows_(int v) {} + @Override public void Items__jump_len_(int v) {} + @Override public void Margins_set(int left, int top, int right, int bot) {} +// @Override public void DataSource_update(Object... ary) { +// String[] src = (String[])ary; +// int trg_len = combo.getItems().length; +// int src_len = src.length; +// for (int i = 0; i < trg_len; ++i) { +// combo.setItem(i, i < src_len ? src[i] : ""); +// } +// } + @Override public boolean List_visible() {return combo.getListVisible();} + @Override public void List_visible_(boolean v) { + String prv_text = combo.getText(); + combo.setListVisible(v); + String cur_text = combo.getText(); + while (!String_.Eq(cur_text, prv_text)) { // NOTE: setting setListVisible to true may cause text to grab item from dropDown list; try to reset to original value; DATE:2016-03-14 + Thread_adp_.Sleep(1); + combo.setText(prv_text); + cur_text = combo.getText(); + } + int text_len = prv_text == null ? 0 : prv_text.length(); + combo.setSelection(new Point(text_len, text_len)); + } +} +class Swt_combo__selection_listener implements SelectionListener { + private final Swt_combo combo; + public Swt_combo__selection_listener(Swt_combo combo) {this.combo = combo;} + @Override public void widgetSelected(SelectionEvent arg0) { + GfoEvMgr_.Pub(combo, GfuiComboBox.Evt__selected_changed); + } + @Override public void widgetDefaultSelected(SelectionEvent arg0) {} +} diff --git a/150_gfui/xtn/gplx/gfui/Swt_combo_ctrl.java b/150_gfui/xtn/gplx/gfui/Swt_combo_ctrl.java new file mode 100644 index 000000000..70a6c01cc --- /dev/null +++ b/150_gfui/xtn/gplx/gfui/Swt_combo_ctrl.java @@ -0,0 +1,394 @@ +/* +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.gfui; + +import gplx.*; +import gplx.core.envs.Op_sys; +import gplx.core.envs.Op_sys_; +import gplx.core.threads.Thread_adp_; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; + +public class Swt_combo_ctrl extends Swt_text_w_border implements GxwElem, GxwComboBox, Swt_control, GfoEvMgrOwner { // REF: https://www.eclipse.org/forums/index.php/t/351029/; http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet320.java + private final Text swt_text; + private final Swt_combo_list list; + public Swt_combo_ctrl(Swt_control owner, Color color, Keyval_hash ctorArgs) { + super(owner, color, new Keyval_hash()); + Display display = owner.Under_control().getDisplay(); + Shell shell = owner.Under_control().getShell(); + this.swt_text = super.Under_text(); + this.list = new Swt_combo_list(display, shell, this); + + swt_text.addListener(SWT.KeyDown, new Swt_combo_text__key_down(list)); + swt_text.addListener(SWT.MouseUp, new Swt_combo_text__mouse_up(list)); + + Table swt_list = list.Under_table_as_swt(); + swt_list.addListener(SWT.DefaultSelection, new Swt_combo_list__default_selection(this, list)); + swt_list.addListener(SWT.KeyDown, new Swt_combo_list__default_selection(this, list)); + swt_list.addListener(SWT.MouseDown, new Swt_combo_list__mouse_down(this, list)); + + // listeners to hide list-box when focus is transfered, shell is moved, text-box is clicked, etc + Swt_combo_ctrl__list_hider_cmd list_hide_cmd = new Swt_combo_ctrl__list_hider_cmd(list); + Swt_combo_ctrl__focus_out focus_out_lnr = new Swt_combo_ctrl__focus_out(display, this, list, list_hide_cmd); + swt_text.addListener(SWT.FocusOut, focus_out_lnr); + swt_list.addListener(SWT.FocusOut, focus_out_lnr); + swt_text.addListener(SWT.FocusIn, new Swt_combo_text__focus_in(this, list)); + swt_list.addListener(SWT.FocusIn, new Swt_combo_ctrl__focus_in(display, list, list_hide_cmd)); + shell.addListener(SWT.Move, new Swt_combo_shell__move(list)); + } + @Override public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr; public void EvMgr_(GfoEvMgr v) {ev_mgr = v;} + @Override public Object SelectedItm() {return null;} + @Override public void SelectedItm_set(Object v) {} + @Override public void Sel_(int bgn, int end) {swt_text.setSelection(new Point(bgn, end));} + @Override public String[] DataSource_as_str_ary() {return list.Items_str_ary();} + @Override public void DataSource_set(Object... ary) {list.Items_((String[])ary);} + @Override public String Text_fallback() {return text_fallback;} private String text_fallback = "";// preserve original-text when using cursor keys in list-box + @Override public void Text_fallback_(String v) {text_fallback = v;} + public void Text_fallback_restore() { + if (String_.Len_eq_0(text_fallback)) return; // handle escape pressed after dropdown is visible, but down / up not pressed + this.Text_(text_fallback); + this.text_fallback = ""; + } + @Override public void Items__update(String[] ary) {list.Items_(ary);} + @Override public void Items__size_to_fit(int count) {list.Resize_shell(count);} + @Override public int List_sel_idx() {return list.Sel_idx();} + @Override public void List_sel_idx_(int v) {list.Sel_idx_(v);} + @Override public boolean List_visible() {return list.Visible();} + @Override public void List_visible_(boolean v) {list.Visible_(v);} + @Override public void Items__visible_rows_(int v) {list.Visible_rows = v;} + @Override public void Items__jump_len_(int v) {list.Jump_len = v;} + public Rectangle Bounds() {return super.Under_control().getBounds();} + public String Text() {return swt_text.getText();} public void Text_(String v) {swt_text.setText(v);} + public void Sel_all() { + String text_text = swt_text.getText(); + this.Sel_(0, String_.Len(text_text)); + } +} +class Swt_combo_list { + private final Display display; private final Shell owner_shell; + private final Swt_combo_ctrl ctrl; + private final Shell shell; + private final Table table; + private int list_len; + public int Jump_len = 5; + public int Visible_rows = 10; + public Swt_combo_list(Display display, Shell owner_shell, Swt_combo_ctrl ctrl) { + this.display = display; this.owner_shell = owner_shell; this.ctrl = ctrl; + this.shell = new Shell(display, SWT.ON_TOP); + shell.setLayout(new FillLayout()); + this.table = new Table(shell, SWT.SINGLE); + } + public Table Under_table_as_swt() {return table;} + public int Items_len() {return table.getItemCount();} + public TableItem[] Items() {return table.getItems();} + public TableItem Sel_itm(int i) {return table.getSelection()[i];} + public void Items_text_(int idx, String v) {table.getItem(idx).setText(v);} + public String[] Items_str_ary() {return items_str_ary;} private String[] items_str_ary = String_.Ary_empty; + public void Items_(String[] new_ary) { + int new_len = new_ary.length; + if (new_len == 0) Visible_(Bool_.N); // if new_ary is empty, then hide list box; else, brief flicker as items are removed + + // remove all cur-items that are no longer needed b/c new_ary is smaller + int cur_len = list_len; + for (int i = new_len; i < cur_len; ++i) { + table.remove(new_len); + } + + // update new_ary; + for (int i = 0; i < new_len; ++i) { + TableItem item = null; + if (i < cur_len) // existing item; reuse it + item = table.getItem(i); + else // no ite; create a new one + item = new TableItem(table, SWT.NONE); + String cur_text = item.getText(); + String new_text = new_ary[i]; + if (!String_.Eq(cur_text, new_text) && new_text != null) { + item.setText(new_text); + } + } + this.list_len = new_len; + + // resize list-shell to # of items + int max_len = this.Visible_rows; + if ( new_len == cur_len // do not resize if same # + || new_len > max_len && cur_len > max_len // do not resize if new_len and cur_len are both off-screen + ) {} + this.items_str_ary = new_ary; +// else +// Resize_shell(list_len); + } + public int Sel_idx() {return table.getSelectionIndex();} + public void Sel_idx_(int v) {table.setSelection(v);} + public void Sel_idx_nudge(boolean fwd) {Sel_idx_adj(fwd, 1);} + public void Sel_idx_jump(boolean fwd) {Sel_idx_adj(fwd, Jump_len);} + private void Sel_idx_adj(boolean fwd, int adj) { + if (!Visible()) Visible_(Bool_.Y); // these are called by cursor keys; always make visible + int cur_idx = table.getSelectionIndex(); + int new_idx = cur_idx; + int idx_n = list_len - 1; + if (fwd) { + if (cur_idx == idx_n) + new_idx = -1; + else if (cur_idx == -1) + new_idx = 0; + else { + new_idx = cur_idx + adj; + if (new_idx >= idx_n) + new_idx = idx_n; + } + } + else { + if (cur_idx == 0) + new_idx = -1; + else if (cur_idx == -1) + new_idx = idx_n; + else { + new_idx = cur_idx - adj; + if (new_idx < 0) + new_idx = 0; + } + } + Sel_idx_by_key(new_idx); + } + public void Sel_idx_by_key(int v) { + table.setSelection(v); + if (v == -1) { // nothing selected; restore orig + ctrl.Text_fallback_restore(); + } else { // something selected; transfer selected item to text + String sel_text = table.getItem(v).getText(); + ctrl.Text_(sel_text); + ctrl.Sel_(sel_text.length(), sel_text.length()); + } + GfoEvMgr_.Pub(ctrl, GfuiComboBox.Evt__selected_changed); + } + public boolean Visible() {return shell.isVisible();} + public void Visible_(boolean v) { + if (v && list_len == 0) return; // never show if 0 items; occurs when users presses alt+down or down when in combo-box + shell.setVisible(v); + } + public void Resize_shell(int len) { + Rectangle text_bounds = display.map(owner_shell, null, ctrl.Bounds()); + int adj = Op_sys.Cur().Tid() == Op_sys.Lnx.Tid() ? 9 : 2; // NOTE: magic-numbers from gnosygnu's Windows-7, OS-X and openSUSE; Linux # is not correct for different number of items, but looks acceptable for 25; + int max_len = this.Visible_rows; + int height = (table.getItemHeight() * (len > max_len ? max_len : len)) + adj; + if (height != shell.getSize().y) // only resize if height is different + shell.setBounds(text_bounds.x, text_bounds.y + text_bounds.height - 1, text_bounds.width, height); + } +} +class Swt_combo_text__key_down implements Listener { // for list-box, highlight item or toggle visiblility based on keys + private final Swt_combo_list list; + public Swt_combo_text__key_down(Swt_combo_list list) { + this.list = list; + } + @Override public void handleEvent(Event event) { + try { + int mask = event.stateMask; + boolean no_modifier = false; + boolean ctrl_modifier = false; + boolean alt_modifier = false; + if ((mask & SWT.ALT) == SWT.ALT) {alt_modifier = true;} + else if ((mask & SWT.CTRL) == SWT.CTRL){ctrl_modifier = true;} + else if ((mask & SWT.SHIFT) == SWT.SHIFT){} + else + no_modifier = true; + switch (event.keyCode) { + case SWT.ARROW_DOWN: + if (event.stateMask == SWT.ALT) { + list.Visible_(true); + } else { + list.Sel_idx_nudge(Bool_.Y); + } + event.doit = false; + break; + case SWT.ARROW_UP: + if (event.stateMask == SWT.ALT) { + list.Visible_(false); + } else { + list.Sel_idx_nudge(Bool_.N); + } + event.doit = false; + break; + case SWT.PAGE_DOWN: + if (no_modifier) { + list.Sel_idx_jump(Bool_.Y); + event.doit = false; + } + else if (ctrl_modifier || alt_modifier) { + list.Visible_(Bool_.N); + event.doit = false; + } + break; + case SWT.PAGE_UP: + if (no_modifier) { + list.Sel_idx_jump(Bool_.N); + event.doit = false; + } + else if (ctrl_modifier || alt_modifier) { + list.Visible_(Bool_.N); + event.doit = false; + } + break; + case SWT.CR: + if (list.Visible() && list.Sel_idx() != -1) { + list.Visible_(false); + } + break; + case SWT.ESC: + list.Sel_idx_by_key(-1); + list.Visible_(false); + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} +class Swt_combo_text__mouse_up implements Listener { // if list-box is visible, left-click on text-box should hide list-box; note that left-click does not fire focus-in event; EX: focus html-box; click on url-box; focus-in event not fired + private final Swt_combo_list list; + public Swt_combo_text__mouse_up(Swt_combo_list list) { + this.list = list; + } + @Override public void handleEvent(Event event) { + if (event.button == 1) { // left-click + if (list.Visible()) { + list.Visible_(false); + } + } + } +} +class Swt_combo_list__default_selection implements Listener { // transfer list-box's selected to text-box + private final Swt_combo_ctrl ctrl; private final Swt_combo_list list; + public Swt_combo_list__default_selection(Swt_combo_ctrl ctrl, Swt_combo_list list) { + this.ctrl = ctrl; this.list = list; + } + @Override public void handleEvent(Event arg0) { + ctrl.Text_(list.Sel_itm(0).getText()); + list.Visible_(false); + } +} +class Swt_combo_list__key_down implements Listener { // hide list-box if escape pressed + private final Swt_combo_ctrl ctrl; private final Swt_combo_list list; + public Swt_combo_list__key_down(Swt_combo_ctrl ctrl, Swt_combo_list list) { + this.ctrl = ctrl; + this.list = list; + } + @Override public void handleEvent(Event event) { + if (event.keyCode == SWT.ESC) { + ctrl.Text_fallback_restore(); + list.Visible_(false); + } + } +} +class Swt_combo_list__mouse_down implements Listener { // left-click on list-box should transfer item to text-box and publish "accepted" event + private final Swt_combo_ctrl ctrl; + private final Swt_combo_list list; + public Swt_combo_list__mouse_down(Swt_combo_ctrl ctrl, Swt_combo_list list) { + this.ctrl = ctrl; + this.list = list; + } + @Override public void handleEvent(Event event) { + if (event.button == 1) { // left-click + ctrl.Text_(list.Sel_itm(0).getText()); + GfoEvMgr_.Pub(ctrl, GfuiComboBox.Evt__selected_changed); + GfoEvMgr_.Pub(ctrl, GfuiComboBox.Evt__selected_accepted); + } + } +} +class Swt_combo_ctrl__focus_out implements Listener { // run hide-cmd when list-box when text-box / list-box loses focus + private final Display display; + private final Control text_as_swt, list_as_swt; + private final Swt_combo_ctrl__list_hider_cmd list_hide_cmd; + public Swt_combo_ctrl__focus_out(Display display, Swt_combo_ctrl ctrl, Swt_combo_list list, Swt_combo_ctrl__list_hider_cmd list_hide_cmd) { + this.list_hide_cmd = list_hide_cmd; + this.display = display; + this.text_as_swt = ctrl.Under_text(); + this.list_as_swt = list.Under_table_as_swt(); + } + @Override public void handleEvent(Event arg0) { + if (display.isDisposed()) return; + Control control = display.getFocusControl(); + if (control == null || control == text_as_swt || control == list_as_swt) { + list_hide_cmd.Active = true; + display.asyncExec(list_hide_cmd); + } + } +} +class Swt_combo_ctrl__focus_in implements Listener { // cancel hide-cmd if list-box gains focus + private final Display display; + private final Swt_combo_ctrl__list_hider_cmd list_hide_cmd; + private final Control list_as_swt; + + public Swt_combo_ctrl__focus_in(Display display, Swt_combo_list list, Swt_combo_ctrl__list_hider_cmd list_hide_cmd) { + this.display = display; + this.list_as_swt = list.Under_table_as_swt(); + this.list_hide_cmd = list_hide_cmd; + } + @Override public void handleEvent(Event arg0) { + if (display.isDisposed()) return; + Control control = display.getFocusControl(); + if (control == list_as_swt) + list_hide_cmd.Active = false; + } +} +class Swt_combo_text__focus_in implements Listener { // hide list-box when text-box is focused + private final Swt_combo_ctrl ctrl; private final Swt_combo_list list; + public Swt_combo_text__focus_in(Swt_combo_ctrl ctrl, Swt_combo_list list) { + this.ctrl = ctrl; this.list = list; + } + @Override public void handleEvent(Event arg0) { + if (list.Visible()) + list.Visible_(false); + else + ctrl.Sel_all(); + } +} +class Swt_combo_shell__move implements Listener { // hide list-box when shell is moved + private final Swt_combo_list list; + public Swt_combo_shell__move(Swt_combo_list list) {this.list = list;} + @Override public void handleEvent(Event arg0) { + list.Visible_(false); + } +} +class Swt_combo_ctrl__list_hider_cmd implements Runnable { // hide list-box; can be "canceled" + private final Swt_combo_list list; + public boolean Active = true; + public Swt_combo_ctrl__list_hider_cmd(Swt_combo_list list) { + this.list = list; + } + @Override public void run() { + if (Active) + list.Visible_(false); + } +} \ No newline at end of file diff --git a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java index 33312063e..22c5b5fb9 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java +++ b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java @@ -82,6 +82,17 @@ class Swt_lnr_key implements KeyListener { 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: val -= 32; // lowercase keys are transmitted as ascii value, instead of key value; EX: "a" is 97 instead of 65 break; + case 39: val = IptKey_.Quote.Val(); break; + case 44: val = IptKey_.Comma.Val(); break; + case 45: val = IptKey_.Minus.Val(); break; + case 46: val = IptKey_.Period.Val(); break; + case 47: val = IptKey_.Slash.Val(); break; + case 59: val = IptKey_.Semicolon.Val(); break; + case 61: val = IptKey_.Equal.Val(); break; + case 91: val = IptKey_.OpenBracket.Val(); break; + case 93: val = IptKey_.CloseBracket.Val(); break; + case 96: val = IptKey_.Tick.Val(); break; + case 127: val = IptKey_.Delete.Val(); break; case 16777217: val = IptKey_.Up.Val(); break; case 16777218: val = IptKey_.Down.Val(); break; case 16777219: val = IptKey_.Left.Val(); break; @@ -90,6 +101,7 @@ class Swt_lnr_key implements KeyListener { case 16777222: val = IptKey_.PageDown.Val(); break; case 16777223: val = IptKey_.Home.Val(); break; case 16777224: val = IptKey_.End.Val(); break; + case 16777225: val = IptKey_.Insert.Val(); break; case 16777226: val = IptKey_.F1.Val(); break; case 16777227: val = IptKey_.F2.Val(); break; case 16777228: val = IptKey_.F3.Val(); break; @@ -104,11 +116,15 @@ class Swt_lnr_key implements KeyListener { case 16777237: val = IptKey_.F12.Val(); break; case 16777259: val = IptKey_.Equal.Val(); break; case 16777261: val = IptKey_.Minus.Val(); break; + case 16777298: val = IptKey_.CapsLock.Val(); break; + case 16777299: val = IptKey_.NumLock.Val(); break; case 16777300: val = IptKey_.ScrollLock.Val(); break; case 16777301: val = IptKey_.Pause.Val(); break; + case 16777303: val = IptKey_.PrintScreen.Val(); break; case 327680: val = IptKey_.Insert.Val(); break; } - if (Has_ctrl(ev.stateMask)) val |= IptKey_.KeyCode_Ctrl; + + if (Has_ctrl(ev.stateMask)) val |= IptKey_.KeyCode_Ctrl; if (Bitmask_.Has_int(ev.stateMask, IptKey_.KeyCode_Shift)) val |= IptKey_.KeyCode_Alt; if (Bitmask_.Has_int(ev.stateMask, IptKey_.KeyCode_Ctrl)) val |= IptKey_.KeyCode_Shift; // Tfds.Write(String_.Format("val={4} keyCode={0} stateMask={1} keyLocation={2} character={3}", ev.keyCode, ev.stateMask, ev.keyLocation, ev.character, val)); diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index be427acbb..3b4e856dd 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -37,11 +37,11 @@ import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; class Swt_html implements Gxw_html, Swt_control, FocusListener { private Swt_html_lnr_location lnr_location; private Swt_html_lnr_status lnr_status; - public Swt_html(Swt_kit kit, Swt_control owner_control, KeyValHash ctorArgs) { + public Swt_html(Swt_kit kit, Swt_control owner_control, Keyval_hash ctorArgs) { this.kit = kit; lnr_location = new Swt_html_lnr_location(this); lnr_status = new Swt_html_lnr_status(this); - Object browser_tid_obj = ctorArgs.FetchValOr(Swt_kit.Cfg_Html_BrowserType, null); + Object browser_tid_obj = ctorArgs.Get_val_or(Swt_kit.Cfg_Html_BrowserType, null); this.browser_tid = browser_tid_obj == null ? Browser_tid_none : Int_.cast(browser_tid_obj); browser = new Browser(owner_control.Under_composite(), browser_tid); core = new Swt_core_cmds_html(this, browser); @@ -52,6 +52,7 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { browser.addStatusTextListener(lnr_status); browser.addFocusListener(this); browser.addTitleListener(new Swt_html_lnr_title(this)); + // browser.addOpenWindowListener(new Swt_open_window_listener(this)); // handle target='blank' // browser.addTraverseListener(new Swt_html_lnr_Traverse(this)); } public Swt_kit Kit() {return kit;} private Swt_kit kit; @@ -251,6 +252,13 @@ class Swt_html_lnr_mouse implements MouseListener { return IptEvtDataMouse.new_(btn, IptMouseWheel_.None, ev.x, ev.y); } } +//class Swt_open_window_listener implements OpenWindowListener { +// private final Swt_html html_box; +// public Swt_open_window_listener(Swt_html html_box) {this.html_box = html_box;} +// @Override public void open(WindowEvent arg0) { +// Tfds.Write(); +// } +//} /* NOTE_1:browser scrollbar and click a click in the scrollbar area will raise a mouse-down/mouse-up event in content-editable mode diff --git a/150_gfui/xtn/gplx/gfui/Swt_lbl.java b/150_gfui/xtn/gplx/gfui/Swt_lbl.java index 2339ffff8..57b2d730d 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_lbl.java +++ b/150_gfui/xtn/gplx/gfui/Swt_lbl.java @@ -25,7 +25,7 @@ import org.eclipse.swt.widgets.Label; class Swt_lbl implements GxwElem, Swt_control { private Label lbl; - public Swt_lbl(Swt_control owner, KeyValHash ctorArgs) { + public Swt_lbl(Swt_control owner, Keyval_hash ctorArgs) { lbl = new Label(owner.Under_composite(), SWT.CENTER); core = new Swt_core_cmds(lbl); lbl.addKeyListener(new Swt_lnr_key(this)); diff --git a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java index d5e1c28b2..9292b61ac 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java +++ b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java @@ -28,7 +28,7 @@ import org.eclipse.swt.widgets.*; public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, GfoEvMgrOwner { private GfuiInvkCmd cmd_sync; // private GfuiInvkCmd cmd_async; // NOTE: async needed for some actions like responding to key_down and calling .setSelection; else app hangs; DATE:2014-04-30 - public Swt_tab_mgr(Swt_kit kit, Swt_control owner_control, KeyValHash ctorArgs) { + public Swt_tab_mgr(Swt_kit kit, Swt_control owner_control, Keyval_hash ctorArgs) { this.kit = kit; tab_folder = new CTabFolder(owner_control.Under_composite(), SWT.BORDER); tab_folder.setBorderVisible(false); @@ -113,7 +113,7 @@ public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, Gfo Gfui_tab_itm_data trg_tab_data = Get_tab_data(trg_tab_itm); int src_tab_idx = src_tab_data.Idx(), trg_tab_idx = trg_tab_data.Idx(); tab_folder.setSelection(trg_tab_itm); - GfoEvMgr_.PubVals(this, Gfui_tab_mgr.Evt_tab_switched, KeyVal_.new_("src", src_tab_data.Key()), KeyVal_.new_("trg", trg_tab_data.Key())); + GfoEvMgr_.PubVals(this, Gfui_tab_mgr.Evt_tab_switched, Keyval_.new_("src", src_tab_data.Key()), Keyval_.new_("trg", trg_tab_data.Key())); return src_tab_idx < trg_tab_idx; } public void Tabs_select_by_itm(CTabItem itm) { diff --git a/150_gfui/xtn/gplx/gfui/Swt_text.java b/150_gfui/xtn/gplx/gfui/Swt_text.java index f734e1e55..f710921e5 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_text.java +++ b/150_gfui/xtn/gplx/gfui/Swt_text.java @@ -32,7 +32,7 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; class Swt_text implements GxwTextFld, Swt_control { private Text text_box; - public Swt_text(Swt_control owner_control, KeyValHash ctorArgs) { + public Swt_text(Swt_control owner_control, Keyval_hash ctorArgs) { int text_box_args = ctorArgs.Has(GfuiTextBox_.Ctor_Memo) ? SWT.MULTI | SWT.WRAP | SWT.V_SCROLL : SWT.NONE diff --git a/150_gfui/xtn/gplx/gfui/Swt_text_w_border.java b/150_gfui/xtn/gplx/gfui/Swt_text_w_border.java index 8c23b82e7..880b10f89 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_text_w_border.java +++ b/150_gfui/xtn/gplx/gfui/Swt_text_w_border.java @@ -34,7 +34,7 @@ public class Swt_text_w_border implements GxwTextFld, Swt_control { private Composite text_host; private Composite text_margin; private Text text_elem; - public Swt_text_w_border(Swt_control owner_control, Color color, KeyValHash ctorArgs) { + public Swt_text_w_border(Swt_control owner_control, Color color, Keyval_hash ctorArgs) { Composite owner = owner_control.Under_composite(); int text_elem_style = ctorArgs.Has(GfuiTextBox_.Ctor_Memo) ? SWT.MULTI | SWT.WRAP | SWT.V_SCROLL : SWT.FLAT; New_box_text_w_border(owner.getDisplay(), owner.getShell(), text_elem_style, color); @@ -72,7 +72,7 @@ public class Swt_text_w_border implements GxwTextFld, Swt_control { text_host = new Composite(shell, SWT.FLAT); text_margin = new Composite(text_host, SWT.FLAT); text_elem = new Text(text_margin, style); - text_elem .addTraverseListener(Swt_lnr_traverse_ignore_ctrl._); // do not allow ctrl+tab to change focus when pressed in text box; allows ctrl+tab to be used by other bindings; DATE:2014-04-30 + text_elem .addTraverseListener(Swt_lnr_traverse_ignore_ctrl.Instance); // do not allow ctrl+tab to change focus when pressed in text box; allows ctrl+tab to be used by other bindings; DATE:2014-04-30 text_host.setSize(20, 20); text_host.setBackground(color); text_margin.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); @@ -85,5 +85,5 @@ class Swt_lnr_traverse_ignore_ctrl implements TraverseListener { public void keyTraversed(TraverseEvent e) { if (Swt_lnr_key.Has_ctrl(e.stateMask)) e.doit = false; } - public static final Swt_lnr_traverse_ignore_ctrl _ = new Swt_lnr_traverse_ignore_ctrl(); + public static final Swt_lnr_traverse_ignore_ctrl Instance = new Swt_lnr_traverse_ignore_ctrl(); } \ No newline at end of file diff --git a/400_xowa/.project b/400_xowa/.project deleted file mode 100644 index cd7955f03..000000000 --- a/400_xowa/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 400_xowa - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/400_xowa/lib/jtidy_xowa.jar b/400_xowa/lib/jtidy_xowa.jar deleted file mode 100644 index 9dfc67948..000000000 Binary files a/400_xowa/lib/jtidy_xowa.jar and /dev/null differ diff --git a/400_xowa/lib/luaj_xowa.jar b/400_xowa/lib/luaj_xowa.jar deleted file mode 100644 index 414a1cd71..000000000 Binary files a/400_xowa/lib/luaj_xowa.jar and /dev/null differ diff --git a/400_xowa/src/gplx/core/brys/Bit_heap_rdr_tst.java b/400_xowa/src/gplx/core/brys/Bit_heap_rdr_tst.java index 7e3000734..3e8d51532 100644 --- a/400_xowa/src/gplx/core/brys/Bit_heap_rdr_tst.java +++ b/400_xowa/src/gplx/core/brys/Bit_heap_rdr_tst.java @@ -29,10 +29,8 @@ public class Bit_heap_rdr_tst { fxt.Test__get_bool(Bool_.Y).Test__cur( 3, 6, 0); fxt.Test__get_bool(Bool_.Y).Test__cur( 1, 7, 0); fxt.Test__get_bool(Bool_.Y).Test__cur( 0, 0, 1); - fxt.Load(0); fxt.Test__get_bool(Bool_.N).Test__cur( 0, 1, 0); - fxt.Load(6); fxt.Test__get_bool(Bool_.N).Test__cur( 3, 1, 0); fxt.Test__get_bool(Bool_.Y).Test__cur( 1, 2, 0); @@ -40,11 +38,9 @@ public class Bit_heap_rdr_tst { } @Test public void Get_byte() { fxt.Load(255).Test__get_byte(2, 3).Test__cur(63, 2, 0); - fxt.Load(255, 3); fxt.Test__get_byte(7, 127); fxt.Test__get_byte(3, 7); - fxt.Load(10); fxt.Test__get_bool(false); fxt.Test__get_byte(3, 5); diff --git a/400_xowa/src/gplx/core/brys/Bit_heap_wtr_tst.java b/400_xowa/src/gplx/core/brys/Bit_heap_wtr_tst.java index cfa1b5697..5767cc44d 100644 --- a/400_xowa/src/gplx/core/brys/Bit_heap_wtr_tst.java +++ b/400_xowa/src/gplx/core/brys/Bit_heap_wtr_tst.java @@ -37,10 +37,8 @@ public class Bit_heap_wtr_tst { @Test public void Add_byte_digits() { fxt.Clear().Add_byte(4, 15).Test__vals(4, 15); fxt.Clear().Add_byte(7, 127).Add_byte(2, 3).Test__vals(1, 1, 255); - fxt.Clear().Add_byte(3, 7).Add_byte(3, 7).Test__vals(6, 63); fxt.Clear().Add_byte(6, 63).Add_byte(3, 7).Test__vals(1, 1, 255); - fxt.Clear().Add_byte(3, 6).Add_byte(3, 6).Test__vals(6, 54); } @Test public void Add_int_hzip() { diff --git a/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java b/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java index 95f8f8e97..2b4713105 100644 --- a/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java +++ b/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java @@ -39,16 +39,3 @@ class Gfo_enum_itm { public int Sort() {return sort;} private int sort; public String Xtn() {return xtn;} private String xtn; } -/* -enum_grps -grp_guid,grp_key,grp_int,grp_name,grp_sort,grp_xtn -0-1-2-3,xowa.wiki,0,wiki,, - -enum_itms -grp_int,itm_guid,itm_key,itm_int,itm_name,itm_sort,itm_xtn -1,0-1-2-3,0,en.wikipedia.org,0,enwiki,0,'' - -class Gfo_enum_mgr { -// public Gui -} -*/ diff --git a/400_xowa/src/gplx/core/lists/Binary_search_.java b/400_xowa/src/gplx/core/lists/Binary_search_.java index a5f989340..81193c791 100644 --- a/400_xowa/src/gplx/core/lists/Binary_search_.java +++ b/400_xowa/src/gplx/core/lists/Binary_search_.java @@ -49,4 +49,36 @@ public class Binary_search_ { } return Int_.Min_value; // should only occur if (a) ary's 0th slot is not ""; or (b) some unknown error } + public static int Search(List_adp__getable list, int list_len, CompareAble val) { + if (list_len == 1) return 0; + int interval = list_len / 2; + int pos = interval - List_adp_.Base1; + int pos_last = list_len - 1; + int pos_prv = -1; + int loop_count = 0; + while (loop_count++ < 32) { // 32 bit integer + CompareAble lo = (CompareAble)list.Get_at(pos); + CompareAble hi = pos + 1 == list_len ? null : (CompareAble)list.Get_at(pos + 1); + int adj = 0; + int lo_comp = val.compareTo(lo); + if (lo_comp == CompareAble_.Less) // val is < lo; search slots below + adj = -1; + else { + if (hi == null) return pos; // hi is null when at last slot in ary + int hi_comp = val.compareTo(hi); + if (hi_comp == CompareAble_.More) // val is > hi; search slots above + adj = 1; + else + return pos; // val is > lo and < hi; return slot + } + interval /= 2; + if (interval == 0) interval = 1; // do not allow 0 intervals; pos must always change; + pos += (interval * adj); + if (pos == 0 && pos_prv == 0) break; // NOTE: this will only happen when 1st member is not "" + if (pos < 0) pos = 0; + else if (pos > pos_last) pos = pos_last; + pos_prv = pos; + } + return Int_.Min_value; // should only occur if (a) ary's 0th slot is not ""; or (b) some unknown error + } } diff --git a/400_xowa/src/gplx/core/lists/StatRng_tst.java b/400_xowa/src/gplx/core/lists/StatRng_tst.java index 2c32c15df..892e00f49 100644 --- a/400_xowa/src/gplx/core/lists/StatRng_tst.java +++ b/400_xowa/src/gplx/core/lists/StatRng_tst.java @@ -33,7 +33,7 @@ public class StatRng_tst { //@Test public void Basic() {fx.Test_parse_tmpl_str_test("{{#switch:{{{1}}}|a|b|c=1|d=2}}", "{{test|a}}", "1");} } /* -public class Pf_func_switch_tst { -// Mwl_parser_fxt fx = new Mwl_parser_fxt(); Pf_func_lang_rsc rsc = Pf_func_lang_rsc.Instance; +public class Pf_func_switch_tst { +// Mwl_parser_fxt fx = new Mwl_parser_fxt(); Pf_func_lang_rsc rsc = Pf_func_lang_rsc.Instance; */ \ No newline at end of file diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser.java b/400_xowa/src/gplx/core/net/Gfo_url_parser.java index 364eedf4e..fed49741c 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url_parser.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser.java @@ -74,7 +74,6 @@ public class Gfo_url_parser { 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(); @@ -86,7 +85,6 @@ public class Gfo_url_parser { 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) { diff --git a/400_xowa/src/gplx/core/tests/Tst_mgr.java b/400_xowa/src/gplx/core/tests/Tst_mgr.java index 397e2327c..7b0364284 100644 --- a/400_xowa/src/gplx/core/tests/Tst_mgr.java +++ b/400_xowa/src/gplx/core/tests/Tst_mgr.java @@ -20,10 +20,10 @@ import gplx.core.strings.*; public class Tst_mgr { public Tst_mgr ThrowError_n_() {throwError = false; return this;} private boolean throwError = true; public List_adp Results() {return results;} List_adp results = List_adp_.new_(); - public KeyValHash Vars() {return vars;} KeyValHash vars = KeyValHash.new_(); - public Object Vars_get_by_key(String key) {return vars.FetchValOr(key, null);} + public Keyval_hash Vars() {return vars;} Keyval_hash vars = new Keyval_hash(); + public Object Vars_get_by_key(String key) {return vars.Get_val_or(key, null);} public String Vars_get_bry_as_str(String key, int bgn, int end) { - byte[] bry = (byte[])vars.FetchValOr(key, null); if (bry == null) return String_.Empty; + byte[] bry = (byte[])vars.Get_val_or(key, null); if (bry == null) return String_.Empty; if (bgn < 0 || end > bry.length || end < bgn || end < 0) return "<>"; return String_.new_u8(Bry_.Mid(bry, bgn, end)); } diff --git a/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java index 8468f5c23..96d809b89 100644 --- a/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java +++ b/400_xowa/src/gplx/core/threads/Gfo_thread_cmd_replace.java @@ -42,7 +42,7 @@ public class Gfo_thread_cmd_replace implements Gfo_thread_cmd { String raw = Io_mgr.Instance.LoadFilStr(fil); int pairs_len = pairs.Count(); for (int i = 0; i < pairs_len; i++) { - KeyVal kv = (KeyVal)pairs.Get_at(i); + Keyval kv = (Keyval)pairs.Get_at(i); raw = String_.Replace(raw, kv.Key(), kv.Val_to_str_or_null()); } Io_mgr.Instance.SaveFilStr(fil, raw); @@ -53,7 +53,7 @@ public class Gfo_thread_cmd_replace implements Gfo_thread_cmd { if (ctx.Match(k, Invk_async_bgn)) Exec_find_replace(); else if (ctx.Match(k, Invk_owner)) return owner; else if (ctx.Match(k, Invk_fil_)) fil = Bry_fmtr_eval_mgr_.Eval_url(url_eval_mgr, m.ReadBry("v")); - else if (ctx.Match(k, Invk_add)) pairs.Add(KeyVal_.new_(m.ReadStr("find"), m.ReadStr("replace"))); + else if (ctx.Match(k, Invk_add)) pairs.Add(Keyval_.new_(m.ReadStr("find"), m.ReadStr("replace"))); else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_async_bgn = "async_bgn", Invk_owner = "owner", Invk_fil_ = "fil_", Invk_add = "add"; diff --git a/400_xowa/src/gplx/dbs/Db_attach_cmd.java b/400_xowa/src/gplx/dbs/Db_attach_cmd.java deleted file mode 100644 index 929094385..000000000 --- a/400_xowa/src/gplx/dbs/Db_attach_cmd.java +++ /dev/null @@ -1,54 +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.dbs; import gplx.*; -import gplx.dbs.engines.sqlite.*; -public class Db_attach_cmd { - private final boolean diff_db; - private final Db_conn conn; private final String attach_name; private final Io_url attach_url; - private final List_adp sql_list = List_adp_.new_(); - Db_attach_cmd(Db_conn conn, String attach_name, Io_url attach_url) { - this.conn = conn; this.attach_name = attach_name; this.attach_url = attach_url; - Sqlite_conn_info conn_info = (Sqlite_conn_info)conn.Conn_info(); - this.diff_db = !String_.Eq(conn_info.Url().Raw(), attach_url.Raw()); - } - public Db_attach_cmd Add_fmt(String msg, String sql_fmt, Object... sql_args) { - String sql = String_.Format(sql_fmt, sql_args); - sql = String_.Replace(sql, "", diff_db ? attach_name + "." : ""); // replace with either "attach_db." or ""; - sql_list.Add(new Db_exec_sql_by_attach_itm(msg, sql)); - return this; - } - public void Exec() { - Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; - if (diff_db) conn.Env_db_attach(attach_name, attach_url); - conn.Txn_bgn(attach_name); // NOTE: BEGIN TRAN must occur after ATTACH else sqlite will throw error - int len = sql_list.Count(); - for (int i = 0; i < len; ++i) { - Db_exec_sql_by_attach_itm itm = (Db_exec_sql_by_attach_itm)sql_list.Get_at(i); - usr_dlg.Plog_many("", "", itm.Msg()); - conn.Exec_sql(itm.Sql()); - } - conn.Txn_end(); - if (diff_db) conn.Env_db_detach(attach_name); - } - public static Db_attach_cmd new_(Db_conn conn, String attach_name, Io_url attach_url) {return new Db_attach_cmd(conn, attach_name, attach_url);} -} -class Db_exec_sql_by_attach_itm { - public Db_exec_sql_by_attach_itm(String msg, String sql) {this.msg = msg; this.sql = sql;} - public String Msg() {return msg;} private final String msg; - public String Sql() {return sql;} private final String sql; -} diff --git a/400_xowa/src/gplx/dbs/Db_attach_rdr.java b/400_xowa/src/gplx/dbs/Db_attach_rdr.java deleted file mode 100644 index be5178316..000000000 --- a/400_xowa/src/gplx/dbs/Db_attach_rdr.java +++ /dev/null @@ -1,40 +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.dbs; import gplx.*; -import gplx.dbs.engines.sqlite.*; -public class Db_attach_rdr { - private final boolean diff_db; - private final Db_conn conn; private final String attach_name; private final Io_url attach_url; - public Db_attach_rdr(Db_conn conn, String attach_name, Io_url attach_url) { - this.conn = conn; this.attach_name = attach_name; this.attach_url = attach_url; - Sqlite_conn_info conn_info = (Sqlite_conn_info)conn.Conn_info(); - this.diff_db = !String_.Eq(conn_info.Url().Raw(), attach_url.Raw()); - } - public void Attach() { - try { - if (diff_db) conn.Env_db_attach(attach_name, attach_url); - } catch (Exception e) {Err_.Noop(e); Gfo_usr_dlg_.Instance.Warn_many("", "", "db:failed to attach db; name=~{0} url=~{1}", attach_name, attach_url.Raw());} - } - public Db_rdr Exec_as_rdr(String sql) { - sql = String_.Replace(sql, "", diff_db ? attach_name + "." : ""); // replace with either "attach_db." or ""; - return conn.Exec_sql_as_rdr_v2(sql); - } - public void Detach() { - if (diff_db) conn.Env_db_detach(attach_name); - } -} diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java index 53e1a309b..bfc2bae0f 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java @@ -36,7 +36,6 @@ public class Db_cfg_itm { public String To_str() {Fail_if_null(); return val;} private void Fail_if_null() {if (val == null) throw Err_.new_wo_type("cfg.val is empty", "grp", grp, "key", key); } private Err err_parse(Exception e, String type) {return Err_.new_wo_type("cfg.val is not parseable", "grp", grp, "key", key, "val", val, "type", type).Trace_ignore_add_1_();} - private static final String Grp_none = ""; public static Db_cfg_itm new_str (String key, String val) {return new Db_cfg_itm(Grp_none , key, val);} public static Db_cfg_itm new_str (String grp, String key, String val) {return new Db_cfg_itm(grp , key, val);} @@ -54,6 +53,5 @@ public class Db_cfg_itm { public static Db_cfg_itm new_DateAdp (String grp, String key, DateAdp val) {return new Db_cfg_itm(grp , key, val.XtoStr_fmt_yyyyMMdd_HHmmss());} public static Db_cfg_itm new_guid (String key, Guid_adp val) {return new Db_cfg_itm(Grp_none , key, val.To_str());} public static Db_cfg_itm new_guid (String grp, String key, Guid_adp val) {return new Db_cfg_itm(grp , key, val.To_str());} - public static final Db_cfg_itm Empty = new Db_cfg_itm("empty", "empty", null); } diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index d65ab9e63..40b37fb30 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -34,7 +34,7 @@ public class Db_cfg_tbl implements Rls_able { stmt_update = Db_stmt_.Rls(stmt_update); stmt_select = Db_stmt_.Rls(stmt_select); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));} public void Delete_val(String grp, String key) {conn.Stmt_delete(tbl_name, fld_grp, fld_key).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_delete();} public void Delete_grp(String grp) {conn.Stmt_delete(tbl_name, fld_grp).Crt_str(fld_grp, grp).Exec_delete();} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} @@ -49,7 +49,7 @@ public class Db_cfg_tbl implements Rls_able { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); try { stmt_insert.Clear().Val_str(fld_grp, grp).Val_str(fld_key, key).Val_str(fld_val, val).Exec_insert(); - } catch (Exception e) {throw Err_.new_exc(e, "db", "db_cfg.insert failed", "grp", grp, "key", key, "val", val, "db", conn.Conn_info().Xto_api());} + } catch (Exception e) {throw Err_.new_exc(e, "db", "db_cfg.insert failed", "grp", grp, "key", key, "val", val, "db", conn.Conn_info().Db_api());} } public void Update_yn (String grp, String key, boolean val) {Update_str(grp, key, val ? "y" : "n");} public void Update_byte (String grp, String key, byte val) {Update_str(grp, key, Byte_.To_str(val));} diff --git a/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java b/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java index 21802bdb7..249011d40 100644 --- a/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java +++ b/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java @@ -26,7 +26,7 @@ class Schema_loader_mgr__null implements Schema_loader_mgr { } class Schema_loader_mgr__sqlite implements Schema_loader_mgr { public void Load(Schema_db_mgr db_mgr, Db_conn conn) { - Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Conn_info().Xto_api()); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Conn_info().Db_api()); Dbmeta_tbl_mgr tbl_mgr = db_mgr.Tbl_mgr(); Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", String_.Ary_empty, String_.Ary("type", "name", "sql"), Db_qry__select_in_tbl.Order_by_null); Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto(); diff --git a/400_xowa/src/gplx/dbs/percentiles/Log_tbl_fmtr.java b/400_xowa/src/gplx/dbs/percentiles/Log_tbl_fmtr.java new file mode 100644 index 000000000..c59a3b227 --- /dev/null +++ b/400_xowa/src/gplx/dbs/percentiles/Log_tbl_fmtr.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.dbs.percentiles; import gplx.*; import gplx.dbs.*; +class Log_tbl_fmtr { + private final Bry_bfr bfr = Bry_bfr.new_(); + private final List_adp itms = List_adp_.new_(); + private Log_fld_itm[] ary; + public Log_tbl_fmtr Add_str(String key, int len) {ary = null; itms.Add(new Log_fld_itm__bry(Type_adp_.Tid__bry, key, len)); return this;} + public Log_tbl_fmtr Add_int(String key, int bgn, int end) {ary = null; itms.Add(new Log_fld_itm__int(Type_adp_.Tid__int, key, bgn, end)); return this;} + public void Log(Object... vals) { + if (ary == null) + ary = (Log_fld_itm[])itms.To_ary_and_clear(Log_fld_itm.class); + int len = ary.length; + for (int i = 0; i < len; ++i) { + Log_fld_itm itm = ary[i]; + Object val = vals[i]; + if (i != 0) bfr.Add_byte_pipe(); + itm.Fmt(bfr, val); + } + bfr.Add_byte_nl(); + } + public String To_str_and_clear() {return bfr.To_str_and_clear();} +} +interface Log_fld_itm { + void Fmt(Bry_bfr bfr, Object val); +} +abstract class Log_fld_itm__base implements Log_fld_itm { + public Log_fld_itm__base(int tid, String key, int len) { + this.tid = tid; this.key = key; this.len = len; + } + public int Tid() {return tid;} private final int tid; + public String Key() {return key;} private final String key; + public int Len() {return len;} protected int len; + public abstract void Fmt(Bry_bfr bfr, Object val); +} +class Log_fld_itm__bry extends Log_fld_itm__base { + public Log_fld_itm__bry(int tid, String key, int len) {super(tid, key, len);} + @Override public void Fmt(Bry_bfr bfr, Object val) { + byte[] val_bry = Bry_.cast(val); + int val_bry_len = val_bry.length; + int pad_len = this.len - val_bry_len; + bfr.Add(val_bry); + if (pad_len > 0) + bfr.Add_byte_repeat(Byte_ascii.Space, pad_len); + } +} +class Log_fld_itm__int extends Log_fld_itm__base { + public Log_fld_itm__int(int tid, String key, int bgn, int end) {super(tid, key, 0); + this.bgn = bgn; this.end = end; + this.len = Int_.DigitCount(end); + } + public int Bgn() {return bgn;} private final int bgn; + public int End() {return end;} private final int end; + @Override public void Fmt(Bry_bfr bfr, Object val) { + int val_int = Int_.cast(val); + String val_str = String_.PadBgn(Int_.To_str(val_int), this.Len(), " "); + bfr.Add_str_u8(val_str); + } +} diff --git a/400_xowa/src/gplx/dbs/percentiles/Percentile_rng.java b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng.java new file mode 100644 index 000000000..e054bb98c --- /dev/null +++ b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng.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.dbs.percentiles; import gplx.*; import gplx.dbs.*; +public class Percentile_rng { + private long total_max; private int total_needed; + private int score_max, score_len_max; + private long prv_time; + public int Score_bgn() {return score_bgn;} private int score_bgn; + public int Score_end() {return score_end;} private int score_end; + public int Score_len() {return score_len;} private int score_len; + public int Found_rdr() {return found_rdr;} private int found_rdr; + public int Found_all() {return found_all;} private int found_all; + public int Elapsed() {return elapsed;} private int elapsed; + public Percentile_rng Init(long total_max, int score_max) { + this.total_max = total_max; + this.score_max = score_max; + this.score_len_max = score_max / 20; // limit to 5% + return this; + } + public void Select_init(int total_needed, int prv_score_bgn, int prv_score_len, int score_len_adj) { + this.total_needed = total_needed; + this.found_all = 0; + this.prv_time = gplx.core.envs.Env_.TickCount(); + int score_unit = Calc_score_unit(total_needed, total_max, score_max); + if (prv_score_bgn == Score_null) { + score_len = score_unit + (score_unit * score_len_adj); + score_bgn = score_max; + Rng_len_(Bool_.Y); + } + else { + score_len = prv_score_len; + score_bgn = prv_score_bgn; + score_end = score_bgn + score_len; + } + } + public void Update(int found_rdr) { + this.found_rdr = found_rdr; + this.found_all += found_rdr; + + // calc rng_multiplier based on found_rdr and total_needed; EX: 100=total_needed; 10=found_rdr; 40=found_all -> 6=rng_multiplier; (100 - 40 / 10) + int rng_multiplier = 1; + if (found_rdr == 0) { + rng_multiplier = 4; + } else { + int total_remaining = total_needed - found_all; + rng_multiplier = total_remaining == 0 ? 1 : Math_.Ceil_as_int(total_remaining / found_rdr); + } + + // calc new score_len + int new_score_len = score_len * rng_multiplier; + if (new_score_len < 1) new_score_len = score_len; + else if (new_score_len > score_len_max) new_score_len = score_len_max; + score_len = new_score_len; + Rng_len_(Bool_.N); + + // update times + long new_time = gplx.core.envs.Env_.TickCount(); + this.elapsed = Int_.Subtract_long(new_time, prv_time); + prv_time = new_time; + } + private void Rng_len_(boolean first) { + score_end = score_bgn + (first ? 1 : 0); // + 1 to include rows with scores at max; EX: > 999,998 AND < 1,000,001 + score_bgn = score_end - score_len; + if (score_bgn < 0) score_bgn = 0; // make sure score is not negative + } + @gplx.Internal protected static int Calc_score_unit(int total_needed, long total_max, int score_max) {// TEST: + int rv = (int)Math_.Ceil(Math_.Div_safe_as_double(total_needed, Math_.Div_safe_as_double(total_max, score_max))); // EX: 100 needed / (16 M / 1 M) -> 7 units to fill 100 + if (rv > score_max) rv = score_max; // never allow score_unit to be > score_max; occurs when total_needed > total_max; EX: 50 needed; 10 available + return rv; + } + public static final int Score_null = -1; +} diff --git a/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_log.java b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_log.java new file mode 100644 index 000000000..432e2325f --- /dev/null +++ b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_log.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.dbs.percentiles; import gplx.*; import gplx.dbs.*; +public class Percentile_rng_log { + private final Log_tbl_fmtr fmtr = new Log_tbl_fmtr(); + private byte[] search; private int rslts_needed; + private int rdr_idx; + public Percentile_rng_log(int score_max) { + fmtr.Add_str("search" , 50) + .Add_int("rslts_needed" , 1, 999) + .Add_int("rdr_idx" , 0, 100) // warn if more than 100 sql queries + .Add_int("score_bgn" , 0, score_max) + .Add_int("score_end" , 0, score_max) + .Add_int("score_len" , 1, 100000) + .Add_int("rdr_found" , 0, 9999) // warn if more than 9.999 seconds + .Add_int("total_found" , 0, 999) + .Add_int("total_needed" , 1, 999) + ; + } + public void Init(byte[] search, int rslts_needed) { + this.search = search; this.rslts_needed = rslts_needed; + rdr_idx = -1; + } + public void Log(int score_bgn, int score_end, int rdr_found, int total_found, int pass_time) { + fmtr.Log(search, rslts_needed, ++rdr_idx, score_bgn, score_end, score_end - score_bgn, rdr_found, total_found, pass_time); + } + public String To_str_and_clear() {return fmtr.To_str_and_clear();} +} diff --git a/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_tst.java b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_tst.java new file mode 100644 index 000000000..127441eab --- /dev/null +++ b/400_xowa/src/gplx/dbs/percentiles/Percentile_rng_tst.java @@ -0,0 +1,63 @@ +/* +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.dbs.percentiles; import gplx.*; import gplx.dbs.*; +import org.junit.*; +public class Percentile_rng_tst { + private final Percentile_rng_fxt fxt = new Percentile_rng_fxt(); + @Before public void init() {fxt.Clear();} + @Test public void Found__000() { + fxt.Test__rng(999994, 1000001); + fxt.Exec__update( 0).Test__rng(999966, 999994); + fxt.Exec__update( 0).Test__rng(999854, 999966); + } + @Test public void Found__025() { + fxt.Test__rng(999994, 1000001); + fxt.Exec__update( 25).Test__rng(999973, 999994); + fxt.Exec__update( 25).Test__rng(999931, 999973); + fxt.Exec__update( 25).Test__rng(999889, 999931); + fxt.Exec__update( 25).Test__rng(999847, 999889); + } + @Test public void Calc_score_unit() { + fxt.Test__calc_score_unit(50, 16000000, 1000000, 4); // to fill 50 -> 16 pages per point -> read every 4 points to get 64 pages + fxt.Test__calc_score_unit(50, 1000, 1000000, 50000); // to fill 50 -> 1000 points per page -> read every 50k points to get 50 pages + fxt.Test__calc_score_unit(50, 25, 1000000, 1000000); // range bounds check; to fill 50, always read full amount + } +} +class Percentile_rng_fxt { + private final Percentile_rng rng = new Percentile_rng(); + public void Clear() { + this.Exec__init_for_wiki(16000000, 1000000); + this.Exec__init_for_search(100, 0); + } + public Percentile_rng_fxt Exec__init_for_wiki (int pages_max, int score_max) { + rng.Init(pages_max, score_max); return this; + } + public Percentile_rng_fxt Exec__init_for_search(int request_count, int score_len_adj) { + rng.Select_init(request_count, Percentile_rng.Score_null, Percentile_rng.Score_null, score_len_adj); return this; + } + public Percentile_rng_fxt Exec__update(int rdr_found) { + rng.Update(rdr_found); return this; + } + public void Test__rng(int expd_bgn, int expd_end) { + Tfds.Eq(expd_end, rng.Score_end(), "rng_end"); + Tfds.Eq(expd_bgn, rng.Score_bgn(), "rng_bgn"); + } + public void Test__calc_score_unit(int request_count, long pages_max, int score_max, int expd) { + Tfds.Eq(expd, Percentile_rng.Calc_score_unit(request_count, pages_max, score_max)); + } +} diff --git a/400_xowa/src/gplx/dbs/percentiles/Percentile_select_base.java b/400_xowa/src/gplx/dbs/percentiles/Percentile_select_base.java new file mode 100644 index 000000000..1191d4e9a --- /dev/null +++ b/400_xowa/src/gplx/dbs/percentiles/Percentile_select_base.java @@ -0,0 +1,67 @@ +/* +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.dbs.percentiles; import gplx.*; import gplx.dbs.*; +public abstract class Percentile_select_base { // SELECT * FROM x ORDER BY y LIMIT 10; + protected Cancelable cxl; + protected Percentile_rng rng; + protected Percentile_rng_log rng_log; + protected void Select() { + Db_rdr rdr = null; + try { + int rdr_found = 0; + while (true) { + if (cxl.Canceled()) return; + if (rdr == null) { + rdr = Rdr__init(); // EXPENSIVE + rdr_found = 0; + if (cxl.Canceled()) return; + } + if (!Row__read(rdr)) { // EXPENSIVE + if (cxl.Canceled()) return; + rng_log.Log(rng.Score_bgn(), rng.Score_end(), rng.Found_rdr(), rng.Found_all(), rng.Elapsed()); + rdr = Rdr__term(rdr); + Rng__update(rdr_found); + boolean found_enough = Found_enough(); + boolean none_left = rng.Score_bgn() == 0; + Rdr__done(found_enough, none_left); + if (found_enough || none_left) + break; + else + continue; // resume from top; will create new rdrd + } + if (Row__eval()) ++rdr_found; + } + } + catch (Exception exc) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "error during percentile; err=~{0}", Err_.Message_gplx_log(exc)); + } + finally { + rdr = Rdr__term(rdr); + } + } + protected abstract Db_rdr Rdr__init(); + @gplx.Virtual protected void Rdr__done(boolean found_enough, boolean none_left) {} + @gplx.Virtual protected Db_rdr Rdr__term(Db_rdr rdr) { + if (rdr != null) rdr.Rls(); + return null; + } + @gplx.Virtual protected void Rng__update(int rdr_found) {rng.Update(rdr_found);} + @gplx.Virtual protected boolean Row__read(Db_rdr rdr) {return true;} + @gplx.Virtual protected boolean Row__eval() {return true;} // NOTE: return true by default; DEPENDENCY: Srch_word_count_wkr + @gplx.Virtual protected boolean Found_enough() {return false;} +} diff --git a/400_xowa/src/gplx/dbs/updates/Sql_runner.java b/400_xowa/src/gplx/dbs/updates/Sql_runner.java new file mode 100644 index 000000000..637f654d5 --- /dev/null +++ b/400_xowa/src/gplx/dbs/updates/Sql_runner.java @@ -0,0 +1,55 @@ +/* +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.dbs.updates; import gplx.*; import gplx.dbs.*; +import gplx.dbs.stmts.*; +/* +sql = +UPDATE page +SET page_score = page_len +WHERE page_id >= ? +AND page_id < ? +state = -1|100000 +*/ +public class Sql_runner { + private final Db_stmt_arg_list list = new Db_stmt_arg_list(); + public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) {conn = v;} private Db_conn conn; + public boolean Quiet() {return quiet;} public void Quiet_(boolean v) {quiet = v;} private boolean quiet; + public String Sql_fmt() {return sql_fmt;} public void Sql_fmt_(String v) {sql_fmt = v;} private String sql_fmt; +// public Db_stmt_arg[] Sql_args() {return sql_args;} public void Sql_args_(Db_stmt_arg[] v) {sql_args = v;} private Db_stmt_arg[] sql_args; + public String Msg() {return msg;} public void Msg_(String v) {msg = v;} private String msg; + public String Fill_next(String state) { + String[] vals = String_.Split(state, "|"); + int val_lo = Int_.parse(vals[0]); + int interval = Int_.parse(vals[1]); + int val_hi = val_lo + interval; + + Db_stmt_arg arg = list.Get_at(0); + arg.Val = val_lo; + arg = list.Get_at(1); + arg.Val = val_hi; + + return String_.Concat_with_str("|", Int_.To_str(val_hi), vals[1]); + } + public void Run() { + Db_stmt stmt = conn.Stmt_sql(sql_fmt); + // foreach (itme) Db_stmt_arg_list list = Db_stmt_arg_list + Gfo_usr_dlg_.Instance.Note_many("", "", msg); + stmt.Exec_update(); + // increment ranges + } +} diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index 21223f446..2561b5713 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -37,7 +37,7 @@ public class Fsd_bin_tbl implements Rls_able { stmt_insert = Db_stmt_.Rls(stmt_insert); stmt_select = Db_stmt_.Rls(stmt_select); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("fsdb_bin__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java index e6710246c..a4fc6d280 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java @@ -21,7 +21,6 @@ public class Fsd_dir_itm { public int Dir_id() {return dir_id;} private final int dir_id; public int Owner() {return owner;} private final int owner; public byte[] Name() {return name;} private final byte[] name; - public static final int Owner_root = 0; public static final Fsd_dir_itm Null = null; } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java index 32e95494d..db7001938 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java @@ -34,7 +34,7 @@ public class Fsd_dir_tbl implements Rls_able { stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name); } public void Create_tbl() { - conn.Ddl_create_tbl + conn.Meta_tbl_create ( Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id))); } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java index 8d6823828..402496c23 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java @@ -42,7 +42,7 @@ public class Fsd_fil_tbl implements Rls_able { stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name); } public void Create_tbl() { - conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_name(tbl_name, idx_owner, fld_owner_id, fld_name, fld_id) )); } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java index c729a5934..40c7fae2b 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java @@ -37,7 +37,6 @@ public class Fsd_thm_itm { public int Req_w() {return req_w;} private int req_w; public double Req_time() {return req_time;} private double req_time; public int Req_page() {return req_page;} private int req_page; - public void Init_by_req(int w, double time, int page) {this.w = w; this.time = time; this.page = page;} public void Init_by_match(Fsd_thm_itm comp) { this.req_w = w; this.req_time = time; this.req_page = page; diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java index 738e85124..24f26361c 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java @@ -48,7 +48,7 @@ public class Fsd_thm_tbl implements Rls_able { stmt_select_by_fil_near = Db_stmt_.Rls(stmt_select_by_fil_near); } public void Create_tbl() { - conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page) )); } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java index a8a22fe6d..839364173 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java @@ -29,7 +29,7 @@ public class Fsm_atr_tbl { this.fld_uid = flds.Add_int_pkey (fld_prefix + "uid"); this.fld_url = flds.Add_str (fld_prefix + "url", 255); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public Fsm_atr_fil Select_1st_or_fail(Fsm_mnt_itm mnt_itm, Fsdb_db_mgr core_mgr, int mnt_id, boolean schema_thm_page) { Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); boolean schema_is_1 = core_mgr.File__schema_is_1(); @@ -47,7 +47,7 @@ public class Fsm_atr_tbl { } } finally {rdr.Rls();} - throw Err_.new_wo_type("missing atr db", "conn", conn.Conn_info().Xto_api()); + throw Err_.new_wo_type("missing atr db", "conn", conn.Conn_info().Db_api()); } public void Insert(int id, String url_rel) { conn.Stmt_insert(tbl_name, flds).Val_int(fld_uid, id).Val_str(fld_url, url_rel).Exec_insert(); diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java index 5b7735f71..05092c304 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java @@ -37,7 +37,7 @@ public class Fsm_bin_tbl { fld_bin_max = Dbmeta_fld_itm.Key_null; } } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert(int id, String url_rel) { conn.Stmt_insert(tbl_name, flds).Crt_int(fld_uid, id).Val_str(fld_url, url_rel).Val_long(fld_bin_len, 0).Val_long(fld_bin_max, 0).Exec_insert(); } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java index d6e1b724e..185be80f8 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java @@ -24,7 +24,7 @@ public class Fsm_cfg_mgr { } public void Ctor_by_load() { Db_cfg_hash hash = Grps_get_or_load(Grp_core); - this.next_id = hash.Get_by(Key_next_id).To_int_or(-1); if (next_id == -1) throw Err_.new_wo_type("next_id not found in cfg", "url", tbl.Conn().Conn_info().Xto_api()); + this.next_id = hash.Get_by(Key_next_id).To_int_or(-1); if (next_id == -1) throw Err_.new_wo_type("next_id not found in cfg", "url", tbl.Conn().Conn_info().Db_api()); this.schema_thm_page = hash.Get_by(Key_schema_thm_page).To_yn_or_n(); this.patch__next_id = hash.Get_by(Key_patch__next_id).To_yn_or_n(); this.patch__page_gt_1 = hash.Get_by(Key_patch__page_gt_1).To_yn_or_n(); diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java index 63a7e414c..fb88fa12b 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java @@ -65,8 +65,8 @@ class Fsm_mnt_itm_ { Fsm_cfg_mgr cfg_mgr = abc_mgr.Cfg_mgr(); int last_id = -1; Fsm_atr_fil atr_fil = atr_mgr.Db__core(); - int max_fil_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1); - int max_thm_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1); + int max_fil_id = atr_fil.Conn().Exec_select_as_int("SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1); + int max_thm_id = atr_fil.Conn().Exec_select_as_int("SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1); last_id = max_fil_id > max_thm_id ? max_fil_id : max_thm_id; cfg_mgr.Patch_next_id_exec(last_id); } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java index 82e057626..1d362bc9a 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java @@ -30,7 +30,7 @@ public class Fsm_mnt_tbl implements Rls_able { } public void Create_tbl() { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); this.Insert(Fsm_mnt_mgr.Mnt_idx_main, Mnt_name_main, Mnt_name_main); this.Insert(Fsm_mnt_mgr.Mnt_idx_user, Mnt_name_user, Mnt_name_user); } diff --git a/400_xowa/src/gplx/langs/gfs/Gfs_msg_bldr_tst.java b/400_xowa/src/gplx/langs/gfs/Gfs_msg_bldr_tst.java index 6e96d5bc3..a40a56f02 100644 --- a/400_xowa/src/gplx/langs/gfs/Gfs_msg_bldr_tst.java +++ b/400_xowa/src/gplx/langs/gfs/Gfs_msg_bldr_tst.java @@ -44,12 +44,12 @@ public class Gfs_msg_bldr_tst { } class Gfs_msg_bldr_fxt { public void Clear() {} String_bldr sb = String_bldr_.new_(); Gfs_msg_bldr msg_bldr = Gfs_msg_bldr.Instance; - public KeyVal kv_(String key, String val) {return KeyVal_.new_(key, val);} - public GfoMsg msg_(String key, KeyVal... args) { + public Keyval kv_(String key, String val) {return Keyval_.new_(key, val);} + public GfoMsg msg_(String key, Keyval... args) { GfoMsg rv = GfoMsg_.new_parse_(key); int len = args.length; for (int i = 0; i < len; i++) { - KeyVal kv = args[i]; + Keyval kv = args[i]; rv.Add(kv.Key(), kv.Val()); } return rv; diff --git a/400_xowa/src/gplx/langs/gfs/Gfs_parser_ctx.java b/400_xowa/src/gplx/langs/gfs/Gfs_parser_ctx.java index 4e9b351ff..7c8d0631c 100644 --- a/400_xowa/src/gplx/langs/gfs/Gfs_parser_ctx.java +++ b/400_xowa/src/gplx/langs/gfs/Gfs_parser_ctx.java @@ -40,7 +40,6 @@ class Gfs_parser_ctx { cur_idf_end = end; } int cur_idf_bgn = -1, cur_idf_end = -1; private void Held_word_clear() {cur_idf_bgn = -1; cur_idf_end = -1;} - public Gfs_nde Make_nde(int tkn_bgn, int tkn_end) { // "abc."; "abc("; "abc;"; "abc{" Gfs_nde nde = new Gfs_nde().Name_rng_(cur_idf_bgn, cur_idf_end); this.Held_word_clear(); @@ -66,17 +65,17 @@ class Gfs_parser_ctx { } class Gfs_err_mgr { public void Fail_eos(Gfs_parser_ctx ctx) {Fail(ctx, Fail_msg_eos, ctx.Src_len());} - public void Fail_unknown_char(Gfs_parser_ctx ctx, int pos, byte c) {Fail(ctx, Fail_msg_unknown_char, pos, KeyVal_.new_("char", Char_.To_str((char)c)));} + public void Fail_unknown_char(Gfs_parser_ctx ctx, int pos, byte c) {Fail(ctx, Fail_msg_unknown_char, pos, Keyval_.new_("char", Char_.To_str((char)c)));} public void Fail_nde_stack_empty(Gfs_parser_ctx ctx, int pos) {Fail(ctx, Fail_msg_nde_stack_empty, pos);} public void Fail_invalid_lxr(Gfs_parser_ctx ctx, int pos, int lxr_tid, byte c) { - Fail(ctx, Fail_msg_invalid_lxr, pos, KeyVal_.new_("char", Char_.To_str((char)c)), KeyVal_.new_("cur_lxr", Gfs_lxr_.Tid__name(lxr_tid)), KeyVal_.new_("prv_lxr", Gfs_lxr_.Tid__name(ctx.Prv_lxr()))); + Fail(ctx, Fail_msg_invalid_lxr, pos, Keyval_.new_("char", Char_.To_str((char)c)), Keyval_.new_("cur_lxr", Gfs_lxr_.Tid__name(lxr_tid)), Keyval_.new_("prv_lxr", Gfs_lxr_.Tid__name(ctx.Prv_lxr()))); } - private void Fail(Gfs_parser_ctx ctx, String msg, int pos, KeyVal... args) { + private void Fail(Gfs_parser_ctx ctx, String msg, int pos, Keyval... args) { byte[] src = ctx.Src(); int src_len = ctx.Src_len(); Fail_args_standard(src, src_len, pos); int len = args.length; for (int i = 0; i < len; i++) { - KeyVal arg = args[i]; + Keyval arg = args[i]; tmp_fail_args.Add(arg.Key(), arg.Val_to_str_or_empty()); } throw Err_.new_wo_type(Fail_msg(msg, tmp_fail_args)); @@ -87,12 +86,12 @@ class Gfs_err_mgr { tmp_fail_args.Add("pos" , pos); } public static final String Fail_msg_invalid_lxr = "invalid character", Fail_msg_unknown_char = "unknown char", Fail_msg_eos = "end of stream", Fail_msg_nde_stack_empty = "node stack empty"; - String Fail_msg(String type, KeyValList fail_args) { + String Fail_msg(String type, Keyval_list fail_args) { tmp_fail_bfr.Add_str_u8(type).Add_byte(Byte_ascii.Colon); int len = fail_args.Count(); for (int i = 0; i < len; i++) { tmp_fail_bfr.Add_byte(Byte_ascii.Space); - KeyVal kv = fail_args.GetAt(i); + Keyval kv = fail_args.Get_at(i); tmp_fail_bfr.Add_str_u8(kv.Key()); tmp_fail_bfr.Add_byte(Byte_ascii.Eq).Add_byte(Byte_ascii.Apos); tmp_fail_bfr.Add_str_u8(kv.Val_to_str_or_empty()).Add_byte(Byte_ascii.Apos); @@ -100,7 +99,7 @@ class Gfs_err_mgr { return tmp_fail_bfr.To_str_and_clear(); } Bry_bfr tmp_fail_bfr = Bry_bfr.reset_(255); - KeyValList tmp_fail_args = new KeyValList(); + Keyval_list tmp_fail_args = new Keyval_list(); private static int excerpt_len = 50; String Fail_excerpt_bgn(byte[] src, int src_len, int pos) { int bgn = pos - excerpt_len; if (bgn < 0) bgn = 0; diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java b/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java index ccff7578a..c42d0a56c 100644 --- a/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java +++ b/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java @@ -105,8 +105,9 @@ public class Gfh_tag_ { , Script_rhs = Bry_.new_a7("") , Span_lhs = Bry_.new_a7("") + , Strong_lhs = Bry_.new_a7("") + , Strong_rhs = Bry_.new_a7("") ; - public static final String Comm_bgn_str = "" diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_utl.java b/400_xowa/src/gplx/langs/htmls/Gfh_utl.java index a3051312c..fde3f9400 100644 --- a/400_xowa/src/gplx/langs/htmls/Gfh_utl.java +++ b/400_xowa/src/gplx/langs/htmls/Gfh_utl.java @@ -102,7 +102,6 @@ public class Gfh_utl { else return dirty ? bfr.To_bry_and_clear() : bry; } - private static final Btrie_slim_mgr unescape_trie = Btrie_slim_mgr.ci_a7() .Add_bry_byte(Gfh_entity_.Lt_bry , Byte_ascii.Lt) .Add_bry_byte(Gfh_entity_.Gt_bry , Byte_ascii.Gt) diff --git a/400_xowa/src/gplx/langs/htmls/docs/Gfh_doc_wkr.java b/400_xowa/src/gplx/langs/htmls/docs/Gfh_doc_wkr.java index 3680ecc9a..ef78a3395 100644 --- a/400_xowa/src/gplx/langs/htmls/docs/Gfh_doc_wkr.java +++ b/400_xowa/src/gplx/langs/htmls/docs/Gfh_doc_wkr.java @@ -19,4 +19,4 @@ package gplx.langs.htmls.docs; import gplx.*; import gplx.langs.*; import gplx.l public interface Gfh_doc_wkr { byte[] Hook(); int Parse(byte[] src, int src_bgn, int src_end, int pos); -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java index 0f9ba2562..4802c2897 100644 --- a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java +++ b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java @@ -86,7 +86,6 @@ public class Gfh_tag_rdr { else return false; } - int depth = depth_obj.Val(); boolean tag_is_tail = tag.Tag_is_tail(); if (tail == tag_is_tail) { diff --git a/400_xowa/src/gplx/langs/htmls/docs/Gfh_txt_wkr.java b/400_xowa/src/gplx/langs/htmls/docs/Gfh_txt_wkr.java index d13b0a192..46884ecf7 100644 --- a/400_xowa/src/gplx/langs/htmls/docs/Gfh_txt_wkr.java +++ b/400_xowa/src/gplx/langs/htmls/docs/Gfh_txt_wkr.java @@ -18,4 +18,4 @@ along with this program. If not, see . package gplx.langs.htmls.docs; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; public interface Gfh_txt_wkr { void Parse(int rng_bgn, int rng_end); -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java index 9a2df1bfb..8034391b7 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; import org.junit.*; public class Gfo_url_encoder_tst { - private final Gfo_url_encoder_fxt fxt = new Gfo_url_encoder_fxt(); + private final Gfo_url_encoder_fxt fxt = new Gfo_url_encoder_fxt(); @Test public void Id__nums() {fxt.Encoder_id().Test__bicode("0123456789" , "0123456789");} @Test public void Id__ltrs_lower() {fxt.Encoder_id().Test__bicode("abcdefghijklmnopqrstuvwxyz" , "abcdefghijklmnopqrstuvwxyz");} @Test public void Id__ltrs_upper() {fxt.Encoder_id().Test__bicode("ABCDEFGHIJKLMNOPQRSTUVWXYZ" , "ABCDEFGHIJKLMNOPQRSTUVWXYZ");} @@ -46,7 +46,7 @@ public class Gfo_url_encoder_tst { fxt.Encoder_href().Test__encode("%GC", "%25GC"); } @Test public void Fsys__wnt() { - fxt.Encoder_fsys_safe().Test__encode("Help:Options/HTML", "Help%3AOptions%2FHTML"); + fxt.Encoder_fsys_safe().Test__encode("Options/HTML", "Options%2FHTML"); } } class Gfo_url_encoder_fxt { diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java index cf9687302..11b39d784 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java @@ -32,4 +32,4 @@ public class Gfh_style_wkr__val_as_int implements Gfh_style_wkr { Gfh_style_parser_.Parse(src, src_bgn, src_end, this); return Bry_.To_int_or__lax(src, val_bgn, val_end, -1); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl.java b/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl.java index 07678dcff..d8ae805eb 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl.java +++ b/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl.java @@ -17,11 +17,11 @@ along with this program. If not, see . */ package gplx.langs.jsons; import gplx.*; import gplx.langs.*; public class Json_kv_ary_srl { - public static KeyVal Kv_by_itm(Json_itm itm) { + public static Keyval Kv_by_itm(Json_itm itm) { switch (itm.Tid()) { case Json_itm_.Tid__kv: Json_kv kv = (Json_kv)itm; - return KeyVal_.new_(kv.Key_as_str(), Val_by_itm(kv.Val())); + return Keyval_.new_(kv.Key_as_str(), Val_by_itm(kv.Val())); default: throw Err_.new_unhandled(itm.Tid()); } @@ -39,19 +39,19 @@ public class Json_kv_ary_srl { default: throw Err_.new_unhandled(itm.Tid()); } } - private static KeyVal[] Val_by_itm_ary(Json_ary itm) { + private static Keyval[] Val_by_itm_ary(Json_ary itm) { int subs_len = itm.Len(); - KeyVal[] rv = new KeyVal[subs_len]; + Keyval[] rv = new Keyval[subs_len]; for (int i = 0; i < subs_len; i++) { Json_itm sub = itm.Get_at(i); - KeyVal kv = KeyVal_.new_(Int_.To_str(i + Int_.Base1), Val_by_itm(sub)); + Keyval kv = Keyval_.new_(Int_.To_str(i + Int_.Base1), Val_by_itm(sub)); rv[i] = kv; } return rv; } - public static KeyVal[] Val_by_itm_nde(Json_nde itm) { + public static Keyval[] Val_by_itm_nde(Json_nde itm) { int subs_len = itm.Len(); - KeyVal[] rv = new KeyVal[subs_len]; + Keyval[] rv = new Keyval[subs_len]; for (int i = 0; i < subs_len; i++) { Json_itm sub = itm.Get_at(i); rv[i] = Kv_by_itm(sub); diff --git a/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl_tst.java b/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl_tst.java index 73f5a5918..2d12269e6 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl_tst.java +++ b/400_xowa/src/gplx/langs/jsons/Json_kv_ary_srl_tst.java @@ -35,16 +35,16 @@ class Json_kv_ary_srl_fxt { parser = new Json_parser(); } } private Json_parser parser; - public void Test_parse(String raw_str, KeyVal[] expd) { + public void Test_parse(String raw_str, Keyval[] expd) { byte[] raw_bry = Json_parser_tst.Replace_apos(Bry_.new_u8(raw_str)); Json_doc doc = parser.Parse(raw_bry); - KeyVal[] actl = Json_kv_ary_srl.Val_by_itm_nde(doc.Root_nde()); - Tfds.Eq_str_lines(KeyVal_.Ary_to_str(expd), KeyVal_.Ary_to_str(actl)); + Keyval[] actl = Json_kv_ary_srl.Val_by_itm_nde(doc.Root_nde()); + Tfds.Eq_str_lines(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl)); } - public KeyVal[] ary_(KeyVal... ary) {return ary;} - public KeyVal kv_obj_(String key, Object val) {return KeyVal_.new_(key, val);} - 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_.To_str_lower(val));} - public KeyVal kv_dec_(String key, Decimal_adp val) {return KeyVal_.new_(key, val.To_str());} + public Keyval[] ary_(Keyval... ary) {return ary;} + public Keyval kv_obj_(String key, Object val) {return Keyval_.new_(key, val);} + 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_.To_str_lower(val));} + public Keyval kv_dec_(String key, Decimal_adp val) {return Keyval_.new_(key, val.To_str());} } diff --git a/400_xowa/src/gplx/langs/jsons/Json_parser__list_nde__base.java b/400_xowa/src/gplx/langs/jsons/Json_parser__list_nde__base.java index 9cc600c6e..526a6cf2f 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_parser__list_nde__base.java +++ b/400_xowa/src/gplx/langs/jsons/Json_parser__list_nde__base.java @@ -62,7 +62,7 @@ public class Json_parser__list_nde__base extends Json_parser__itm__base { Json_kv sub = nde.Get_at_as_kv(i); byte[] key = sub.Key_as_bry(); byte[] val = Parse_to_list_as_kv__get_val(sub, key); - list.Add(key, KeyVal_.new_(String_.new_u8(key), String_.new_u8(val))); + list.Add(key, Keyval_.new_(String_.new_u8(key), String_.new_u8(val))); } } @gplx.Virtual protected byte[] Parse_to_list_as_kv__get_val(Json_kv sub, byte[] key) {return sub.Val_as_bry();} diff --git a/400_xowa/src/gplx/langs/jsons/Json_wtr.java b/400_xowa/src/gplx/langs/jsons/Json_wtr.java index d59d547ee..e29a3fb31 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_wtr.java +++ b/400_xowa/src/gplx/langs/jsons/Json_wtr.java @@ -211,10 +211,10 @@ public class Json_wtr { else { Handle_nde_as_ary_itm_0(); Write_grp_bgn(Sym_nde_bgn, Bool_.N); - KeyVal[] kvy = (KeyVal[])obj; + Keyval[] kvy = (Keyval[])obj; int kvy_len = kvy.length; for (int i = 0; i < kvy_len; ++i) { - KeyVal kv = kvy[i]; + Keyval kv = kvy[i]; Object kv_val = kv.Val(); Kv_obj(Bry_.new_u8(kv.Key()), kv_val, Type_adp_.To_tid_obj(kv_val)); } @@ -287,7 +287,7 @@ public class Json_wtr { private static final int Grp_type__json_nde = 1, Grp_type__kv_ary = 2, Grp_type__json_ary = 3, Grp_type__obj_ary = 4; private static int Grp_type__get(Object obj) { Class type = obj.getClass(); - if (Type_adp_.Eq(type, KeyVal[].class)) return Grp_type__kv_ary; + if (Type_adp_.Eq(type, Keyval[].class)) return Grp_type__kv_ary; else if (Type_adp_.Is_array(type)) return Grp_type__obj_ary; else if (Type_adp_.Eq(type, Json_nde.class)) return Grp_type__json_nde; else if (Type_adp_.Eq(type, Json_ary.class)) return Grp_type__json_ary; diff --git a/400_xowa/src/gplx/langs/jsons/Json_wtr_tst.java b/400_xowa/src/gplx/langs/jsons/Json_wtr_tst.java index cfc6884e5..be8b76b55 100644 --- a/400_xowa/src/gplx/langs/jsons/Json_wtr_tst.java +++ b/400_xowa/src/gplx/langs/jsons/Json_wtr_tst.java @@ -84,9 +84,9 @@ public class Json_wtr_tst { fxt.Wtr() .Doc_nde_bgn() .Ary_bgn("a0") - .Ary_itm_obj(KeyVal_.Ary - ( KeyVal_.new_("k1", "v1") - , KeyVal_.new_("k2", "v2") + .Ary_itm_obj(Keyval_.Ary + ( Keyval_.new_("k1", "v1") + , Keyval_.new_("k2", "v2") )) .Ary_end() .Doc_nde_end(); diff --git a/400_xowa/src/gplx/langs/phps/Php_srl_itm.java b/400_xowa/src/gplx/langs/phps/Php_srl_itm.java index 07c6d1ec3..2f23b1301 100644 --- a/400_xowa/src/gplx/langs/phps/Php_srl_itm.java +++ b/400_xowa/src/gplx/langs/phps/Php_srl_itm.java @@ -135,4 +135,4 @@ class Php_srl_wtr { public static void Indent(Bry_bfr bfr, int depth) { if (depth > 0) bfr.Add_byte_repeat(Byte_ascii.Space, depth * 2); // indent } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/langs/phps/Php_srl_parser.java b/400_xowa/src/gplx/langs/phps/Php_srl_parser.java index c775df47b..bcebc38fc 100644 --- a/400_xowa/src/gplx/langs/phps/Php_srl_parser.java +++ b/400_xowa/src/gplx/langs/phps/Php_srl_parser.java @@ -20,18 +20,18 @@ import gplx.core.texts.*; public class Php_srl_parser { @gplx.Internal protected Php_srl_factory Factory() {return factory;} Php_srl_factory factory = new Php_srl_factory(); byte[] raw; int raw_len, pos; - public KeyVal[] Parse_as_kvs(byte[] raw) { + public Keyval[] Parse_as_kvs(byte[] raw) { Php_srl_itm_ary root = Parse(raw); return Xto_kv_ary(root); } - KeyVal[] Xto_kv_ary(Php_srl_itm_ary ary) { + Keyval[] Xto_kv_ary(Php_srl_itm_ary ary) { int len = ary.Subs_len(); - KeyVal[] rv = new KeyVal[len]; + Keyval[] rv = new Keyval[len]; for (int i = 0; i < len; i++) rv[i] = Xto_kv(ary.Subs_get_at(i)); return rv; } - KeyVal Xto_kv(Php_srl_itm_kv itm) { + Keyval Xto_kv(Php_srl_itm_kv itm) { Php_srl_itm itm_key = itm.Key(); Object key = itm_key == null ? null : itm_key.Val(); Php_srl_itm itm_val = itm.Val(); @@ -48,7 +48,7 @@ public class Php_srl_parser { val = itm_val.Val(); break; } - return KeyVal_.obj_(key, val); + return Keyval_.obj_(key, val); } @gplx.Internal protected Php_srl_itm_ary Parse(byte[] raw) { this.raw = raw; this.raw_len = raw.length; pos = 0; diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 688592fbc..530322ecd 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -34,15 +34,19 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.2.1.1"; + public static final String Version = "3.3.4.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; - public static final Gfo_msg_grp Nde = Gfo_msg_grp_.prj_(Name); + public static final Gfo_msg_grp Nde = Gfo_msg_grp_.prj_(Name); public static Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public static void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private static Gfo_usr_dlg usr_dlg; - public static Bry_bfr_mkr Utl__bfr_mkr() {return utl__bry_bfr_mkr;} private static final Bry_bfr_mkr utl__bry_bfr_mkr = new Bry_bfr_mkr(); - public static Io_stream_zip_mgr Utl__zip_mgr() {return utl__zip_mgr;} private static final Io_stream_zip_mgr utl__zip_mgr = new Io_stream_zip_mgr(); + public static Bry_bfr_mkr Utl__bfr_mkr() {return utl__bry_bfr_mkr;} private static final Bry_bfr_mkr utl__bry_bfr_mkr = new Bry_bfr_mkr(); + public static Io_stream_zip_mgr Utl__zip_mgr() {return utl__zip_mgr;} private static final Io_stream_zip_mgr utl__zip_mgr = new Io_stream_zip_mgr(); public static Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} public static void Gfs_mgr_(Xoa_gfs_mgr v) {gfs_mgr = v;} private static Xoa_gfs_mgr gfs_mgr; + public static void Plog_none(String mod, String fmt) { + String msg = mod + ": " + fmt; + Xoa_app_.Usr_dlg().Plog_many("", "", msg); + } public static Gfo_usr_dlg usr_dlg_console_() { Gfo_usr_dlg rv = new Gfo_usr_dlg_base(new Gfo_usr_dlg__log_base(), Gfo_usr_dlg__gui_.Console); rv.Log_wkr().Queue_enabled_(true); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index 28f56f2a2..fd0ba14fd 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -25,10 +25,20 @@ import gplx.xowa.wikis.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.apps.*; import gplx.xowa.files.exts.*; import gplx.xowa.wikis.domains.*; public class Xoa_app_fxt { - public static Xoae_app app_() { + public static Xoae_app Make__app__edit() { Io_mgr.Instance.InitEngine_mem(); Db_conn_bldr.Instance.Reg_default_mem(); - return app_("linux", Io_url_.mem_dir_("mem/xowa/")); + return Make__app__edit("linux", Io_url_.mem_dir_("mem/xowa/")); + } + public static Xoae_app Make__app__edit(String op_sys, Io_url root_dir) { + Io_url user_dir = root_dir.GenSubDir_nest("user", "test_user"); + Gfo_usr_dlg__log_base.Instance.Log_dir_(user_dir.GenSubDir_nest("tmp", "current")); + Xoae_app app = new Xoae_app(Gfo_usr_dlg_.Test(), Xoa_app_mode.Itm_cmd, root_dir, root_dir.GenSubDir("wiki"), root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), op_sys); + app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.core.ios.Io_stream_.Tid_raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text) + GfsCore.Instance.Clear(); // NOTE: must clear + GfsCore.Instance.AddCmd(app, Xoae_app.Invk_app); // NOTE: must add app to GfsCore; app.Gfs_mgr() always adds current app to GfsCore; note this causes old test to leave behind GfsCore for new test + GfsCore.Instance.AddCmd(app, Xoae_app.Invk_xowa); // add alias for app; DATE:2014-06-09 + return app; } public static Xoav_app Make__app__view() { Io_mgr.Instance.InitEngine_mem(); @@ -43,16 +53,6 @@ public class Xoa_app_fxt { rv.Wiki_mgr().Add(new Xowv_wiki(rv, Xow_domain_itm_.Bry__home, user_dir)); return rv; } - public static Xoae_app app_(String op_sys, Io_url root_dir) { - Io_url user_dir = root_dir.GenSubDir_nest("user", "test_user"); - Gfo_usr_dlg__log_base.Instance.Log_dir_(user_dir.GenSubDir_nest("tmp", "current")); - Xoae_app app = new Xoae_app(Gfo_usr_dlg_.Test(), Xoa_app_mode.Itm_cmd, root_dir, root_dir.GenSubDir("wiki"), root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), op_sys); - app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.core.ios.Io_stream_.Tid_raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text) - GfsCore.Instance.Clear(); // NOTE: must clear - GfsCore.Instance.AddCmd(app, Xoae_app.Invk_app); // NOTE: must add app to GfsCore; app.Gfs_mgr() always adds current app to GfsCore; note this causes old test to leave behind GfsCore for new test - GfsCore.Instance.AddCmd(app, Xoae_app.Invk_xowa); // add alias for app; DATE:2014-06-09 - return app; - } public static Xowv_wiki Make__wiki__view(Xoa_app app) {return Make__wiki__view(app, "en.wikipedia.org");} public static Xowv_wiki Make__wiki__view(Xoa_app app, String domain_str) { byte[] domain_bry = Bry_.new_u8(domain_str); @@ -61,14 +61,14 @@ public class Xoa_app_fxt { ((Xoav_wiki_mgr)app.Wiki_mgri()).Add(rv); return rv; } - public static Xowe_wiki wiki_nonwmf(Xoae_app app, String key) { + public static Xowe_wiki Make__wiki__edit__nonwmf(Xoae_app app, String key) { Xol_lang_itm lang = new Xol_lang_itm(app.Lang_mgr(), Xol_lang_itm_.Key_en).Kwd_mgr__strx_(true); Xol_lang_itm_.Lang_init(lang); - return wiki_(app, key, lang); + return Make__wiki__edit(app, key, lang); } - public static Xowe_wiki wiki_tst_(Xoae_app app) {return wiki_(app, "en.wikipedia.org");} - public static Xowe_wiki wiki_(Xoae_app app, String key) {return wiki_(app, key, app.Lang_mgr().Lang_en());} - public static Xowe_wiki wiki_(Xoae_app app, String key, Xol_lang_itm lang) { + public static Xowe_wiki Make__wiki__edit(Xoae_app app) {return Make__wiki__edit(app, "en.wikipedia.org");} + public static Xowe_wiki Make__wiki__edit(Xoae_app app, String key) {return Make__wiki__edit(app, key, app.Lang_mgr().Lang_en());} + public static Xowe_wiki Make__wiki__edit(Xoae_app app, String key, Xol_lang_itm lang) { Io_url wiki_dir = app.Fsys_mgr().Wiki_dir().GenSubDir(key); Xowe_wiki rv = new Xowe_wiki(app, lang, Xow_ns_mgr_.default_(lang.Case_mgr()), Xow_domain_itm_.parse(Bry_.new_u8(key)), wiki_dir); rv.File_mgr().Dbmeta_mgr().Depth_(2); // TEST: written for 2 depth diff --git a/400_xowa/src/gplx/xowa/Xoa_test_.java b/400_xowa/src/gplx/xowa/Xoa_test_.java index 6cb69a06a..b4c95c3e3 100644 --- a/400_xowa/src/gplx/xowa/Xoa_test_.java +++ b/400_xowa/src/gplx/xowa/Xoa_test_.java @@ -23,12 +23,12 @@ public class Xoa_test_ { public static boolean Db_skip() {return Bool_.N;} public static boolean Db_is_mem_dflt() {return Bool_.Y;} public static void Db_init(Io_url sqlite_url) {Db_init(Db_is_mem_dflt(), sqlite_url);} - public static void Db__init__mem(Xowe_wiki wiki) { + public static void Init__db__edit(Xowe_wiki wiki) { Db__init__mem(); wiki.Db_mgr_create_as_sql(); wiki.Data__core_mgr().Init_by_make(Xowd_core_db_props.Test, Xob_info_session.Test); } - public static void Init__db__mem(gplx.xowa.wikis.Xowv_wiki wiki) { + public static void Init__db__view(gplx.xowa.wikis.Xowv_wiki wiki) { Db__init__mem(); wiki.Init_by_make(Xowd_core_db_props.Test, Xob_info_session.Test); // wiki.Data__core_mgr().Init_by_make(Xowd_core_db_props.Test, Xob_info_session.Test); @@ -45,18 +45,6 @@ public class Xoa_test_ { Db_conn_bldr.Instance.Reg_default_sqlite(); } } - public static String Db__print_tbl_as_str(Bry_bfr bfr, Db_conn conn, String tbl, String... cols) { - int cols_len = cols.length; - Db_rdr rdr = conn.Stmt_select(tbl, cols).Exec_select__rls_auto(); - while (rdr.Move_next()) { - for (int i = 0; i < cols_len; ++i) { - bfr.Add_obj(rdr.Read_at(i)); - bfr.Add_byte(i == cols_len - 1 ? Byte_ascii.Nl : Byte_ascii.Pipe); - } - } - rdr.Rls(); - return bfr.To_str_and_clear(); - } public static void Inet__init() { Gfo_inet_conn_.new_prototype_(Gfo_inet_conn_.Tid__mem__hash); } diff --git a/400_xowa/src/gplx/xowa/Xoa_ttl.java b/400_xowa/src/gplx/xowa/Xoa_ttl.java index 5e9680c76..b8e3557ec 100644 --- a/400_xowa/src/gplx/xowa/Xoa_ttl.java +++ b/400_xowa/src/gplx/xowa/Xoa_ttl.java @@ -29,7 +29,8 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. public byte[] Raw() {return raw;} private byte[] raw = Bry_.Empty; public byte[] Wik_txt() {return wik_bgn == -1 ? Bry_.Empty : Bry_.Mid(full_txt, wik_bgn, ns_bgn == -1 ? page_bgn - 1 : ns_bgn - 1);} public Xow_xwiki_itm Wik_itm() {return wik_itm;} private Xow_xwiki_itm wik_itm; - public byte[] Full_txt() { + public byte[] Full_txt_w_ttl_case() {return Xoa_ttl.Replace_unders(Full_db());} + public byte[] Full_txt_by_orig() { int bgn = wik_bgn == -1 ? 0 : ns_bgn == -1 ? page_bgn : ns_bgn; int end = full_txt.length; if (anch_bgn != -1) end = anch_bgn - 1; @@ -56,10 +57,10 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. public int Wik_bgn() {return wik_bgn;} public int Anch_bgn() {return anch_bgn;} // NOTE: anch_bgn is not correct when page has trailing ws; EX: [[A #b]] should have anch_bgn of 3 (1st char after #), but instead it is 2 public byte[] Anch_txt() {return anch_bgn == -1 ? Bry_.Empty : Bry_.Mid(full_txt, anch_bgn, full_txt.length);} - public byte[] Talk_txt() {return ns.Id_is_talk() ? Full_txt() : Bry_.Add(tors_txt, Page_txt());} - public byte[] Subj_txt() {return ns.Id_is_subj() ? Full_txt() : Bry_.Add(tors_txt, Page_txt());} + public byte[] Talk_txt() {return ns.Id_is_talk() ? Full_txt_w_ttl_case() : Bry_.Add(tors_txt, Page_txt());} + public byte[] Subj_txt() {return ns.Id_is_subj() ? Full_txt_w_ttl_case() : Bry_.Add(tors_txt, Page_txt());} public byte[] Full_url() {return Gfo_url_encoder_.Href.Encode(full_txt);} - public String Full_db_as_str() {return String_.new_u8(Full_db());} + public String Full_db_as_str() {return String_.new_u8(Full_db());} public byte[] Full_db() {return ns.Gen_ttl(this.Page_db());} public byte[] Full_db_w_anch() {return Replace_spaces(full_txt);} public byte[] Page_url() {return Xoa_url_encoder.Instance.Encode(this.Page_txt());} @@ -103,11 +104,11 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. return new_(wiki, wiki.Appe().Msg_log(), raw, 0, raw.length); } public static Xoa_ttl parse(Xowe_wiki wiki, byte[] raw) {return new_(wiki, wiki.Appe().Msg_log(), raw, 0, raw.length);} - private static final Object thread_lock = new Object(); + private static final Object thread_lock = new Object(); // $dbkey = preg_replace( '/\xE2\x80[\x8E\x8F\xAA-\xAE]/S', '', $dbkey ); // $dbkey = preg_replace( '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u', '_', $dbkey ); private static final int Char__bidi = 1, Char__ws = 2; - private static final Btrie_slim_mgr char_trie = Btrie_slim_mgr.cs() + private static final Btrie_slim_mgr char_trie = Btrie_slim_mgr.cs() .Add_many_int(Char__bidi , Bry_.New_by_ints(0xE2, 0x80, 0x8E), Bry_.New_by_ints(0xE2, 0x80, 0x8F), Bry_.New_by_ints(0xE2, 0x80, 0xAA), Bry_.New_by_ints(0xE2, 0x80, 0xAB), Bry_.New_by_ints(0xE2, 0x80, 0xAC), Bry_.New_by_ints(0xE2, 0x80, 0xAD), Bry_.New_by_ints(0xE2, 0x80, 0xAE)) .Add_many_int(Char__ws , "\u00A0", "\u1680", "\u180E", "\u2000", "\u2001", "\u2002", "\u2003", "\u2004", "\u2005", "\u2006", "\u2007", "\u2008", "\u2009", "\u200A", "\u2028", "\u2029", "\u202F", "\u205F", "\u3000") ; @@ -386,7 +387,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. public static final int Anch_bgn_anchor_only = 1; // signifies lnki which is only anchor; EX: [[#anchor]] public static final int Max_len = 2048; // ASSUME: max len of 256 * 8 bytes public static final int Null_wik_bgn = -1; - public static final Xoa_ttl Null = null; + public static final Xoa_ttl Null = null; } class Xoa_ttl_trie { public static Btrie_fast_mgr new_() { diff --git a/400_xowa/src/gplx/xowa/Xop_fxt.java b/400_xowa/src/gplx/xowa/Xop_fxt.java index 9f5816438..4e22c5ca8 100644 --- a/400_xowa/src/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src/gplx/xowa/Xop_fxt.java @@ -26,8 +26,8 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.tdbs.hives.*; public class Xop_fxt { public Xop_fxt() { - Xoae_app app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); ctor(app, wiki); } public Xop_fxt(Xoae_app app, Xowe_wiki wiki) { @@ -106,7 +106,7 @@ public class Xop_fxt { public Xop_tblw_th_tkn_chkr tkn_tblw_th_(int bgn, int end) {return (Xop_tblw_th_tkn_chkr)new Xop_tblw_th_tkn_chkr().Src_rng_(bgn, end);} public Xop_tblw_tr_tkn_chkr tkn_tblw_tr_(int bgn, int end) {return (Xop_tblw_tr_tkn_chkr)new Xop_tblw_tr_tkn_chkr().Src_rng_(bgn, end);} public Xop_hdr_tkn_chkr tkn_hdr_(int bgn, int end, int hdr_len) {return (Xop_hdr_tkn_chkr)new Xop_hdr_tkn_chkr().Hdr_level_(hdr_len).Src_rng_(bgn, end);} - public Xop_xnde_tkn_chkr tkn_xnde_br_(int pos) {return tkn_xnde_(pos, pos).Xnde_tagId_(Xop_xnde_tag_.Tid_br);} + public Xop_xnde_tkn_chkr tkn_xnde_br_(int pos) {return tkn_xnde_(pos, pos).Xnde_tagId_(Xop_xnde_tag_.Tid__br);} public Xop_xnde_tkn_chkr tkn_xnde_() {return tkn_xnde_(String_.Pos_neg1, String_.Pos_neg1);} public Xop_xnde_tkn_chkr tkn_xnde_(int bgn, int end) {return (Xop_xnde_tkn_chkr)new Xop_xnde_tkn_chkr().Src_rng_(bgn, end);} public Xop_tkn_chkr_base tkn_curly_bgn_(int bgn) {return new Xop_tkn_chkr_base().TypeId_dynamic(Xop_tkn_itm_.Tid_tmpl_curly_bgn).Src_rng_(bgn, bgn + 2);} @@ -370,6 +370,7 @@ public class Xop_fxt { public void Test_html_wiki_frag(String raw, String... expd_frags) {Test_str_part_y(Exec_html_wiki(raw), expd_frags);} public void Test_html_full_frag(String raw, String... expd_frags) {Test_str_part_y(Exec_html_full(raw), expd_frags);} public void Test_html_full_frag_n(String raw, String... expd_frags) {Test_str_part_n(Exec_html_full(raw), expd_frags);} + public void Test__parse__tmpl_to_html(String raw, String expd) {Test_str_full(raw, gplx.langs.htmls.Gfh_utl.Replace_apos(expd), Exec_html_full(raw));} public void Test__parse__wtxt_to_html(String raw, String expd) { String actl = Exec_html_wiki(raw); Tfds.Eq_str_lines(gplx.langs.htmls.Gfh_utl.Replace_apos(expd), actl, raw); @@ -427,8 +428,8 @@ public class Xop_fxt { } public void Clear_ref_mgr() {this.Page().Ref_mgr().Grps_clear();} // clear to reset count public static Xop_fxt new_nonwmf() { - Xoae_app app = Xoa_app_fxt.app_(); - return new Xop_fxt(app, Xoa_app_fxt.wiki_nonwmf(app, "nethackwiki")); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + return new Xop_fxt(app, Xoa_app_fxt.Make__wiki__edit__nonwmf(app, "nethackwiki")); } private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); public String Exec__parse_to_hdump(String src_str) { diff --git a/400_xowa/src/gplx/xowa/Xow_wiki.java b/400_xowa/src/gplx/xowa/Xow_wiki.java index b58049522..10b199dd8 100644 --- a/400_xowa/src/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src/gplx/xowa/Xow_wiki.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.primitives.*; -import gplx.xowa.langs.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.xwikis.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.cases.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.data.site_stats.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.addons.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; import gplx.fsdb.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.parsers.*; @@ -27,6 +27,7 @@ public interface Xow_wiki extends Xow_ttl_parser, GfoInvkAble { boolean Type_is_edit(); Xoa_app App(); Xol_lang_itm Lang(); + Xol_case_mgr Case_mgr(); byte[] Domain_bry(); // EX: en.wikipedia.org String Domain_str(); int Domain_tid(); // Xow_domain_tid_.Int__wikipedia @@ -47,6 +48,8 @@ public interface Xow_wiki extends Xow_ttl_parser, GfoInvkAble { Xow_mw_parser_mgr Mw_parser_mgr(); Xow_xwiki_mgr Xwiki_mgr(); Xow_wiki_props Props(); + Xow_site_stats_mgr Stats(); void Init_by_wiki(); - Xoa_url_parser Utl__url_parser(); + Xow_url_parser Utl__url_parser(); + Xoax_addon_mgr Addon_mgr(); } diff --git a/400_xowa/src/gplx/xowa/Xowe_wiki.java b/400_xowa/src/gplx/xowa/Xowe_wiki.java index 871bebbb5..bd658688c 100644 --- a/400_xowa/src/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src/gplx/xowa/Xowe_wiki.java @@ -18,13 +18,14 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apps.cfgs.*; import gplx.xowa.apps.cfgs.gui.*; import gplx.xowa.apps.urls.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.caches.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.cases.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.data.site_stats.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.addons.*; import gplx.xowa.users.*; import gplx.xowa.htmls.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.exts.*; import gplx.xowa.htmls.heads.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.css.*; import gplx.xowa.htmls.ns_files.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.bldrs.installs.*; import gplx.xowa.bldrs.setups.maints.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.utils.*; +import gplx.xowa.wikis.ctgs.*; import gplx.xowa.guis.views.*; import gplx.xowa.xtns.gallery.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; @@ -35,7 +36,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { this.app = app; this.lang = lang; this.ns_mgr = ns_mgr; this.domain_itm = domain_itm; this.domain_str = domain_itm.Domain_str(); this.domain_bry = domain_itm.Domain_bry(); this.domain_tid = domain_itm.Domain_type_id(); this.domain_abrv = Xow_abrv_wm_.To_abrv(domain_itm); this.fsys_mgr = new Xow_fsys_mgr(wiki_dir, app.Fsys_mgr().File_dir().GenSubDir(domain_str)); - this.url__parser = new Xoa_url_parser(this); + this.url__parser = new Xow_url_parser(this); this.xwiki_mgr = new Xow_xwiki_mgr(this); this.html__hdump_mgr = new Xow_hdump_mgr(this); this.html_mgr = new Xow_html_mgr(this); @@ -48,9 +49,9 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { cfg_parser = new Xowc_parser(this); props.SiteName_(domain_tid).ServerName_(domain_bry); props.ContentLanguage_(lang.Key_bry()); + stats = new Xow_site_stats_mgr(this); Pf_func_.Reg(lang.Func_regy(), lang); special_mgr = new Xows_mgr(this, lang); - stats = new Xow_wiki_stats(this); sys_cfg = new Xow_sys_cfg(this); hive_mgr = new Xob_hive_mgr(this); util = new Xow_html_util(this); @@ -74,20 +75,21 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { cache_mgr = new Xow_cache_mgr(this); /*if (Bry_.Eq(domain_bry, Xow_domain_itm_.Bry__home))*/ xwiki_mgr.Add_by_atrs(domain_bry, domain_bry); // add full name to xwiki_mgr; needed for lookup in home ns; EX: [[home:Help/Contents]] } - public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; - public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; + public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; + public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse(this, ttl);} public Xoa_ttl Ttl_parse(byte[] src, int src_bgn, int src_end) {return Xoa_ttl.new_(this, app.Msg_log(), src, src_bgn, src_end);} public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {return Xoa_ttl.parse(this, ns_id, ttl);} public boolean Type_is_edit() {return Bool_.Y;} public Xoa_app App() {return app;} - public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang; - public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; - public String Domain_str() {return domain_str;} private final String domain_str; - public int Domain_tid() {return domain_tid;} private final int domain_tid; - public byte[] Domain_abrv() {return domain_abrv;} private final byte[] domain_abrv; - public Xow_domain_itm Domain_itm() {return domain_itm;} private final Xow_domain_itm domain_itm; - public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xow_fsys_mgr fsys_mgr; + public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang; + public Xol_case_mgr Case_mgr() {return lang.Case_mgr();} + public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; + public String Domain_str() {return domain_str;} private final String domain_str; + public int Domain_tid() {return domain_tid;} private final int domain_tid; + public byte[] Domain_abrv() {return domain_abrv;} private final byte[] domain_abrv; + public Xow_domain_itm Domain_itm() {return domain_itm;} private final Xow_domain_itm domain_itm; + public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xow_fsys_mgr fsys_mgr; public Xowd_db_mgr Data__core_mgr() {if (db_mgr == null) return null; return db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? null : this.Db_mgr_as_sql().Core_data_mgr();} // TEST: public Xof_fsdb_mode File__fsdb_mode() {return file_mgr.Fsdb_mode();} public Fsdb_db_mgr File__fsdb_core() {return file_mgr.Db_core();} @@ -98,15 +100,17 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { public boolean Html__hdump_enabled() {return html_mgr__hdump_enabled;} private boolean html_mgr__hdump_enabled = Bool_.N; public Xoh_page_wtr_mgr Html__wtr_mgr() {return html_mgr.Page_wtr_mgr();} public boolean Html__css_installing() {return html__css_installing;} public void Html__css_installing_(boolean v) {html__css_installing = v;} private boolean html__css_installing; - public Xoa_url_parser Utl__url_parser() {return url__parser;} private final Xoa_url_parser url__parser; - public Xow_mw_parser_mgr Mw_parser_mgr() {return mw_parser_mgr;} private final Xow_mw_parser_mgr mw_parser_mgr = new Xow_mw_parser_mgr(); - public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private final Xow_xwiki_mgr xwiki_mgr; - public Xow_wiki_props Props() {return props;} private final Xow_wiki_props props = new Xow_wiki_props(); - public Xow_parser_mgr Parser_mgr() {return parser_mgr;} private final Xow_parser_mgr parser_mgr; + public Xow_url_parser Utl__url_parser() {return url__parser;} private final Xow_url_parser url__parser; + public Xow_mw_parser_mgr Mw_parser_mgr() {return mw_parser_mgr;} private final Xow_mw_parser_mgr mw_parser_mgr = new Xow_mw_parser_mgr(); + public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private final Xow_xwiki_mgr xwiki_mgr; + public Xow_wiki_props Props() {return props;} private final Xow_wiki_props props = new Xow_wiki_props(); + public Xow_site_stats_mgr Stats() {return stats;} private final Xow_site_stats_mgr stats; + public Xow_parser_mgr Parser_mgr() {return parser_mgr;} private final Xow_parser_mgr parser_mgr; + public Xoax_addon_mgr Addon_mgr() {return addon_mgr;} private final Xoax_addon_mgr addon_mgr = new Xoax_addon_mgr(); - public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr; + public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr; public Xoae_app Appe() {return app;} private Xoae_app app; - public Xow_gui_mgr Gui_mgr() {return gui_mgr;} private final Xow_gui_mgr gui_mgr = new Xow_gui_mgr(); + public Xow_gui_mgr Gui_mgr() {return gui_mgr;} private final Xow_gui_mgr gui_mgr = new Xow_gui_mgr(); public Xow_user User() {return user;} private Xow_user user = new Xow_user(); public Xow_data_mgr Data_mgr() {return data_mgr;} private Xow_data_mgr data_mgr; public Xodb_mgr Db_mgr() {return db_mgr;} private Xodb_mgr db_mgr; @@ -137,8 +141,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { public Xow_file_mgr File_mgr() {return file_mgr;} private Xow_file_mgr file_mgr; public Xow_cfg_wiki_core Cfg_wiki_core() {return cfg_wiki_core;} private Xow_cfg_wiki_core cfg_wiki_core; public Xob_import_cfg Import_cfg() {return import_cfg;} private Xob_import_cfg import_cfg; - public Xotdb_fsys_mgr Tdb_fsys_mgr() {return tdb_fsys_mgr;} private final Xotdb_fsys_mgr tdb_fsys_mgr; - public Xow_wiki_stats Stats() {return stats;} private Xow_wiki_stats stats; + public Xotdb_fsys_mgr Tdb_fsys_mgr() {return tdb_fsys_mgr;} private final Xotdb_fsys_mgr tdb_fsys_mgr; public Xou_history_cfg Cfg_history() {return cfg_history;} private Xou_history_cfg cfg_history = new Xou_history_cfg(); public Xoh_cfg_gallery Cfg_gallery() {return cfg_gallery;} private Xoh_cfg_gallery cfg_gallery = new Xoh_cfg_gallery(); public Xoh_file_page_wtr Cfg_file_page() {return cfg_file_page;} private Xoh_file_page_wtr cfg_file_page = new Xoh_file_page_wtr(); diff --git a/400_xowa/src/gplx/xowa/drds/Xod_search_cmd.java b/400_xowa/src/gplx/xowa/addons/Xoax_addon_itm.java similarity index 76% rename from 400_xowa/src/gplx/xowa/drds/Xod_search_cmd.java rename to 400_xowa/src/gplx/xowa/addons/Xoax_addon_itm.java index aee7eae07..96d1a5954 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_search_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/Xoax_addon_itm.java @@ -15,8 +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.xowa.drds; import gplx.*; import gplx.xowa.*; -import gplx.xowa.specials.search.*; -public interface Xod_search_cmd { - void Search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search); +package gplx.xowa.addons; import gplx.*; import gplx.xowa.*; +public interface Xoax_addon_itm { + byte[] Addon__key(); } diff --git a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java new file mode 100644 index 000000000..8b3d5e188 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java @@ -0,0 +1,23 @@ +/* +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.addons; import gplx.*; import gplx.xowa.*; +public class Xoax_addon_mgr { + private final Ordered_hash hash = Ordered_hash_.New_bry(); + public Xoax_addon_itm Itms__get_or_null(byte[] key) {return (Xoax_addon_itm)hash.Get_by(key);} + public void Itms__add(Xoax_addon_itm itm) {hash.Add(itm.Addon__key(), itm);} +} diff --git a/400_xowa/src/gplx/xowa/addons/ctgs/Xoax_ctg_addon.java b/400_xowa/src/gplx/xowa/addons/ctgs/Xoax_ctg_addon.java new file mode 100644 index 000000000..e8dcb50f8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/ctgs/Xoax_ctg_addon.java @@ -0,0 +1,55 @@ +/* +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.addons.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; +import gplx.xowa.wikis.data.tbls.*; +public class Xoax_ctg_addon implements Xoax_addon_itm { // TODO:mem_mgr + private final Xow_wiki wiki; + private final Hash_adp_bry hash = Hash_adp_bry.cs(); + public Xoax_ctg_addon(Xow_wiki wiki) {this.wiki = wiki;} + public byte[] Addon__key() {return Key_const;} public static final byte[] Key_const = Bry_.new_a7("xowa.category"); + public Xoctg_ctg_itm Itms__get_or_null(byte[] key) {return (Xoctg_ctg_itm)hash.Get_by_bry(key);} + public Xoctg_ctg_itm Itms__load(byte[] key) { + Xowd_page_itm tmp_page = new Xowd_page_itm(); + wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page, wiki.Ns_mgr().Ns_category(), key); + gplx.xowa.wikis.data.tbls.Xowd_category_itm itm = wiki.Data__core_mgr().Db__cat_core().Tbl__cat_core().Select(tmp_page.Id()); + return Itms__add(key, itm.Count_pages(), itm.Count_subcs(), itm.Count_files()); + } + public Xoctg_ctg_itm Itms__add(byte[] key, int pages, int subcs, int files) { // TEST: + Xoctg_ctg_itm rv = new Xoctg_ctg_itm(key, pages, subcs, files); + hash.Add(key, rv); + return rv; + } +/* + public long Mem__size__max() {return mem__size__max;} private long mem__size__max; + public long Mem__size__reduce() {return mem__size__reduce;} private long mem__size__reduce; + public void Mem__free__all() {hash.Clear();} + public void Mem__free__reduce() {Mem_mgr_.Free__reduce(hash);} + public void Mem__free__unused() {Mem_mgr_.Free__unused(hash);} + public long Mem__stat__size() {return mem__stat__size;} private long mem__stat__size; + public long Mem__stat__last() {return mem__stat__last;} private long mem__stat__last; + public int Mem__stat__count() {return mem__stat__count;} private int mem__stat__count; +*/ + public static Xoax_ctg_addon Get(Xow_wiki wiki) { + Xoax_ctg_addon rv = (Xoax_ctg_addon)wiki.Addon_mgr().Itms__get_or_null(Key_const); + if (rv == null) { + rv = new Xoax_ctg_addon(wiki); + wiki.Addon_mgr().Itms__add(rv); + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/ctgs/Xoctg_ctg_itm.java b/400_xowa/src/gplx/xowa/addons/ctgs/Xoctg_ctg_itm.java new file mode 100644 index 000000000..8fac9d98e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/ctgs/Xoctg_ctg_itm.java @@ -0,0 +1,32 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; +public class Xoctg_ctg_itm { + public Xoctg_ctg_itm(byte[] ttl_wo_ns, int pages, int subcs, int files) { + this.Ttl_wo_ns = ttl_wo_ns; + this.Pages = pages; + this.Subcs = subcs; + this.Files = files; + this.All = pages + subcs + files; + } + public final byte[] Ttl_wo_ns; + public final int Pages; + public final int Subcs; + public final int Files; + public final int All; +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_cmd.java b/400_xowa/src/gplx/xowa/addons/pagelinks/bldrs/Pglnk_bldr_cmd.java similarity index 55% rename from 400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_cmd.java rename to 400_xowa/src/gplx/xowa/addons/pagelinks/bldrs/Pglnk_bldr_cmd.java index 151074139..6fd85fad9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/pagelinks/bldrs/Pglnk_bldr_cmd.java @@ -15,40 +15,40 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import gplx.dbs.*; -import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; -public class Xob_pagelinks_parser_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd { - private Db_conn core_conn; - private Xowd_pagelinks_temp_tbl temp_tbl; - public Xob_pagelinks_parser_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;} - @Override public String Sql_file_name() {return "pagelinks";} - @Override public String Cmd_key() {return Xob_cmd_keys.Key_wiki_pagelink;} - private static final byte Fld__pl_from = 0, Fld__pl_namespace = 1, Fld__pl_title = 2; +package gplx.xowa.addons.pagelinks.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.pagelinks.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.*; import gplx.xowa.addons.pagelinks.dbs.*; +public class Pglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd { + private Db_conn conn; + private Pglnk_page_link_temp_tbl temp_tbl; private int tmp_src_id, tmp_trg_ns; private int rows = 0; + public Pglnk_bldr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;} + @Override public String Sql_file_name() {return Dump_type_key;} public static final String Dump_type_key = "pagelinks"; + @Override public String Cmd_key() {return Xob_cmd_keys.Key_wiki_page_link;} @Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) { - parser.Fld_cmd_(this).Flds_req_idx_(4, 0, 1, 2); wiki.Init_assert(); - Xowd_db_file core_db = wiki.Data__core_mgr().Db__core(); - this.core_conn = core_db.Conn(); - this.temp_tbl = new Xowd_pagelinks_temp_tbl(core_conn); - core_conn.Ddl_delete_tbl(temp_tbl.Tbl_name()); + parser.Fld_cmd_(this).Flds_req_idx_(4, 0, 1, 2); + Xob_db_file page_link_db = Xob_db_file.New__page_link(wiki); + this.conn = page_link_db.Conn(); + this.temp_tbl = new Pglnk_page_link_temp_tbl(conn); + conn.Meta_tbl_drop(temp_tbl.Tbl_name()); temp_tbl.Create_tbl(); temp_tbl.Insert_bgn(); } @Override public void Cmd_end() { + if (fail) return; temp_tbl.Insert_end(); temp_tbl.Create_idx(); - Xowd_pagelinks_tbl actl_tbl = new Xowd_pagelinks_tbl(core_conn); - core_conn.Ddl_delete_tbl(actl_tbl.Tbl_name()); + Pglnk_page_link_tbl actl_tbl = new Pglnk_page_link_tbl(conn); + conn.Meta_tbl_drop(actl_tbl.Tbl_name()); actl_tbl.Create_tbl(); - core_conn.Exec_sql(Sql__pagelinks__make); - core_conn.Ddl_delete_tbl(temp_tbl.Tbl_name()); + new Db_attach_mgr(conn, new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Conn())) + .Exec_sql_w_msg("updating page_link", Sql__page_link__make); + conn.Meta_tbl_drop(temp_tbl.Tbl_name()); actl_tbl.Create_idx__src_trg(); actl_tbl.Create_idx__trg_src(); - core_conn.Env_vacuum(); + conn.Env_vacuum(); } 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) { @@ -61,13 +61,14 @@ public class Xob_pagelinks_parser_cmd extends Xob_sql_dump_base implements Sql_f break; } } - private static final String Sql__pagelinks__make = String_.Concat_lines_nl_skip_last - ( "INSERT INTO pagelinks (src_id, trg_id, trg_count)" + private static final byte Fld__pl_from = 0, Fld__pl_namespace = 1, Fld__pl_title = 2; + private static final String Sql__page_link__make = String_.Concat_lines_nl_skip_last + ( "INSERT INTO page_link (src_id, trg_id, trg_count)" , "SELECT pl.src_id" , ", p.page_id" , ", Count(p.page_id)" - , "FROM pagelinks_temp pl" - , " JOIN page p ON pl.trg_ns = p.page_namespace AND pl.trg_ttl = p.page_title" + , "FROM page_link_temp pl" + , " JOIN page p ON pl.trg_ns = p.page_namespace AND pl.trg_ttl = p.page_title" , "GROUP BY pl.src_id, p.page_id" ); } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java b/400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_tbl.java similarity index 60% rename from 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java rename to 400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_tbl.java index e1e7b35af..0c4c001d6 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_tbl.java @@ -15,13 +15,13 @@ 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.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +package gplx.xowa.addons.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.pagelinks.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; -public class Xowd_pagelinks_tbl implements Rls_able { - private final String tbl_name = "pagelink"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); +public class Pglnk_page_link_tbl implements Rls_able { + private final String tbl_name = "page_link"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_src_id, fld_trg_id; private final Db_conn conn; - public Xowd_pagelinks_tbl(Db_conn conn) { + public Pglnk_page_link_tbl(Db_conn conn) { this.conn = conn; fld_src_id = flds.Add_int("src_id"); fld_trg_id = flds.Add_int("trg_id"); @@ -30,8 +30,8 @@ public class Xowd_pagelinks_tbl implements Rls_able { } public Db_conn Conn() {return conn;} public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} - public void Create_idx__src_trg() {conn.Ddl_create_idx(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "src_trg", fld_src_id, fld_trg_id));} - public void Create_idx__trg_src() {conn.Ddl_create_idx(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "trg_src", fld_trg_id, fld_src_id));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx__src_trg() {conn.Meta_idx_create(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "src_trg", fld_src_id, fld_trg_id));} + public void Create_idx__trg_src() {conn.Meta_idx_create(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "trg_src", fld_trg_id, fld_src_id));} public void Rls() {} } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java b/400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_temp_tbl.java similarity index 68% rename from 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java rename to 400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_temp_tbl.java index 7f49a996b..d1ccde8ac 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/pagelinks/dbs/Pglnk_page_link_temp_tbl.java @@ -15,13 +15,13 @@ 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.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +package gplx.xowa.addons.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.pagelinks.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; -public class Xowd_pagelinks_temp_tbl implements Rls_able { - private final String tbl_name = "pagelinks_temp"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); +public class Pglnk_page_link_temp_tbl implements Rls_able { + private final String tbl_name = "page_link_temp"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_src_id, fld_trg_ns, fld_trg_ttl; private final Db_conn conn; private Db_stmt stmt_insert; - public Xowd_pagelinks_temp_tbl(Db_conn conn) { + public Pglnk_page_link_temp_tbl(Db_conn conn) { this.conn = conn; flds.Add_int_pkey_autonum("uid"); fld_src_id = flds.Add_int("src_id"); @@ -30,11 +30,11 @@ public class Xowd_pagelinks_temp_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} - public void Create_idx() {conn.Ddl_create_idx(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_src_id, fld_trg_ns, fld_trg_ttl));} - public void Insert_bgn() {conn.Txn_bgn("schema__pagelinks__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} - public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public String Tbl_name() {return tbl_name;} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx() {conn.Meta_idx_create(Gfo_usr_dlg_.Instance, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_src_id, fld_trg_ns, fld_trg_ttl));} + public void Insert_bgn() {conn.Txn_bgn("schema__page_link__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert(int src_id, int trg_ns, byte[] trg_ttl) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear().Val_int(fld_src_id, src_id).Val_int(fld_trg_ns, trg_ns).Val_bry_as_str(fld_trg_ttl, trg_ttl).Exec_insert(); diff --git a/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_addon.java b/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_addon.java new file mode 100644 index 000000000..41601cb6d --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_addon.java @@ -0,0 +1,51 @@ +/* +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.addons.searchs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; +import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; import gplx.xowa.addons.searchs.searchers.cbks.*; +import gplx.xowa.langs.cases.*; +public class Srch_search_addon implements Xoax_addon_itm { + private final Srch_search_mgr search_mgr; + public Srch_search_addon(Xow_wiki wiki) { + this.wiki_domain = wiki.Domain_bry(); + this.db_mgr = new Srch_db_mgr(wiki).Init(); + this.ttl_parser = new Srch_text_parser().Init_for_ttl(wiki.Case_mgr()); + this.search_mgr = new Srch_search_mgr(this, wiki, ttl_parser); + } + public byte[] Addon__key() {return Key_const;} public static final byte[] Key_const = Bry_.new_a7("xowa.search"); + public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain; + public Srch_db_mgr Db_mgr() {return db_mgr;} private final Srch_db_mgr db_mgr; + public Srch_text_parser Ttl_parser() {return ttl_parser;} private final Srch_text_parser ttl_parser; + + public void Search_cancel() {search_mgr.Search_cancel();} + public void Search(Srch_search_qry qry, Srch_rslt_cbk cbk) {search_mgr.Search(qry, cbk);} + public void Clear_rslts_cache() {search_mgr.Clear_rslts_cache();} + + public static final int Score_max = 1000000; + public static final byte Wildcard__star = Byte_ascii.Star; + public static Srch_search_addon Get(Xow_wiki wiki) { + synchronized (wiki.App()) { // THREAD: must synchronized on app, else 2 wikis with simultaneous search commands will get same addon + Srch_search_addon rv = (Srch_search_addon)wiki.Addon_mgr().Itms__get_or_null(Key_const); + if (rv == null) { + Xoa_app_.Usr_dlg().Log_many("", "", "addons.init: ~{0}", Key_const); + rv = new Srch_search_addon(wiki); + wiki.Addon_mgr().Itms__add(rv); + } + return rv; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_cfg.java b/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_cfg.java new file mode 100644 index 000000000..4d4289b79 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/Srch_search_cfg.java @@ -0,0 +1,110 @@ +/* +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.addons.searchs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; +import gplx.core.net.*; +import gplx.xowa.wikis.nss.*; +import gplx.xowa.addons.searchs.searchers.cbks.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_search_cfg implements GfoInvkAble { + private final Xoae_app app; + private String args_default_str = "";// default args for search + private byte search_mode = Tid_search_mode_all_pages_v2; + private int all_pages_extend = 1000; // look ahead by 1000 + private int all_pages_min = 10000; // only look at pages > 10 kb + private boolean log_enabled = false; + public Srch_search_cfg(Xoae_app app) { + this.app = app; + ns_mgr.Add_main_if_empty(); + } + public boolean Enabled() {return enabled;} private boolean enabled = true; + public int Rslts_max() {return results_max;} private int results_max = 25; + public boolean Auto_wildcard() {return auto_wildcard;} private boolean auto_wildcard = false; // automatically add wild-card; EX: Earth -> *Earth* + public Srch_ns_mgr Ns_mgr() {return ns_mgr;} private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr(); + 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.User().Wikii().Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length); + args_default = tmp_url.Qargs(); + } + public void Cancel() {if (addon != null) addon.Search_cancel();} + private Srch_search_addon addon; + public void Search(Xowe_wiki wiki, byte[] search_bry, byte[] cbk_func) { + if ( !enabled + || search_bry.length == 0 + ) return; + if (addon == null) + addon = Srch_search_addon.Get(wiki); + else { + if (!Bry_.Eq(wiki.Domain_bry(), addon.Wiki_domain())) // NOTE: suggest-box caches addon at wiki level; need to check if wiki has changed + addon = Srch_search_addon.Get(wiki); + } + this.Cancel(); + Srch_search_qry qry = Srch_search_qry.New__suggest_box(wiki, this, search_bry); + Srch_rslt_cbk__suggest_box cbk = new Srch_rslt_cbk__suggest_box(wiki.Appe(), cbk_func, search_bry); + addon.Search(qry, cbk); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_enabled)) return Yn.To_str(enabled); + else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_results_max)) return results_max; + else if (ctx.Match(k, Invk_results_max_)) results_max = m.ReadInt("v"); + else if (ctx.Match(k, Invk_search_mode)) return Search_mode_str(search_mode); + else if (ctx.Match(k, Invk_search_mode_)) search_mode = Search_mode_parse(m.ReadStr("v")); + else if (ctx.Match(k, Invk_search_mode_list)) return Options_search_mode_list; + else if (ctx.Match(k, Invk_all_pages_extend)) return all_pages_extend; + else if (ctx.Match(k, Invk_all_pages_extend_)) all_pages_extend = m.ReadInt("v"); + else if (ctx.Match(k, Invk_all_pages_min)) return all_pages_min; + else if (ctx.Match(k, Invk_all_pages_min_)) all_pages_min = m.ReadInt("v"); + else if (ctx.Match(k, Invk_auto_wildcard)) return Yn.To_str(auto_wildcard); + else if (ctx.Match(k, Invk_auto_wildcard_)) auto_wildcard = m.ReadYn("v"); + else if (ctx.Match(k, Invk_log_enabled)) return Yn.To_str(log_enabled); + else if (ctx.Match(k, Invk_log_enabled_)) log_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_args_default)) return args_default_str; + else if (ctx.Match(k, Invk_args_default_)) Args_default_str_(m.ReadStr("v")); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + public static final String + Invk_enabled = "enabled", Invk_enabled_ = "enabled_", Invk_results_max = "results_max", Invk_results_max_ = "results_max_" + , Invk_search_mode = "search_mode", Invk_search_mode_ = "search_mode_", Invk_search_mode_list = "search_mode_list" + , Invk_all_pages_extend = "all_pages_extend", Invk_all_pages_extend_ = "all_pages_extend_" + , Invk_all_pages_min = "all_pages_min", Invk_all_pages_min_ = "all_pages_min_" + , Invk_auto_wildcard = "auto_wildcard", Invk_auto_wildcard_ = "auto_wildcard_" + , Invk_log_enabled = "log_enabled", Invk_log_enabled_ = "log_enabled_" + , Invk_args_default = "args_default", Invk_args_default_ = "args_default_" + ; + private static final String Str_search_mode_search = "Search", Str_search_mode_all_pages_v1 = "AllPages", Str_search_mode_all_pages_v2 = "AllPages_(v2)"; + public static final int[] Ns_default_main = new int[] {Xow_ns_.Tid__main}; + public static final byte Tid_search_mode_all_pages_v1 = 0, Tid_search_mode_search = 1, Tid_search_mode_all_pages_v2 = 2; + private static Keyval[] Options_search_mode_list = Keyval_.Ary(Keyval_.new_(Str_search_mode_search), Keyval_.new_(Str_search_mode_all_pages_v1), Keyval_.new_(Str_search_mode_all_pages_v2)); + private static byte Search_mode_parse(String v) { + if (String_.Eq(v, Str_search_mode_search)) return Tid_search_mode_search; + else if (String_.Eq(v, Str_search_mode_all_pages_v1)) return Tid_search_mode_all_pages_v1; + else if (String_.Eq(v, Str_search_mode_all_pages_v2)) return Tid_search_mode_all_pages_v2; + else throw Err_.new_unhandled(v); + } + private static String Search_mode_str(byte v) { + switch (v) { + case Tid_search_mode_search: return Str_search_mode_search; + case Tid_search_mode_all_pages_v1: return Str_search_mode_all_pages_v1; + case Tid_search_mode_all_pages_v2: return Str_search_mode_all_pages_v2; + default: throw Err_.new_unhandled(v); + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg.java new file mode 100644 index 000000000..1fb4362ca --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg.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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +public class Srch_db_cfg { + public Srch_db_cfg(int version_id, long page_count, int word_count, int link_count_score_max, int link_count_score_cutoff, int link_score_max) { + this.version_id = version_id; + this.page_count = page_count; + this.word_count = word_count; + this.link_count_score_max = link_count_score_max; + this.link_count_score_cutoff = link_count_score_cutoff; + this.link_score_max = link_score_max; + } + public int Version_id() {return version_id;} private int version_id; + public boolean Version_id__needs_upgrade() {return version_id < Srch_db_upgrade.Version__link_score;} + public long Page_count() {return page_count;} private long page_count; + public int Word_count() {return word_count;} private int word_count; + public int Link_count_score_max() {return link_count_score_max;} private int link_count_score_max; + public int Link_count_score_cutoff() {return link_count_score_cutoff;} private int link_count_score_cutoff; + public int Link_score_max() {return link_score_max;} private int link_score_max; + public void Update_link(int link_score_max) {this.link_score_max = link_score_max;} + public void Update_word(int word_count, int link_count_score_max, int link_count_score_cutoff) { + this.version_id = Srch_db_upgrade.Version__link_score; + this.word_count = word_count; + this.link_count_score_max = link_count_score_max; + this.link_count_score_cutoff = link_count_score_cutoff; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg_.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg_.java new file mode 100644 index 000000000..d0a8bd519 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_cfg_.java @@ -0,0 +1,61 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.cfgs.*; +public class Srch_db_cfg_ { + public static Srch_db_cfg New(Db_cfg_tbl cfg_tbl, long page_count, int version_id) { // NOTE: dflt values are for old search dbs + int word_count = cfg_tbl.Assert_int(Grp__search__cfg, Key__word_count, 0); + int link_count_score_max = cfg_tbl.Assert_int(Grp__search__cfg, Key__link_count_score_max, 0); + int link_count_score_cutoff = cfg_tbl.Assert_int(Grp__search__cfg, Key__link_count_score_cutoff, 0); + int link_score_max = cfg_tbl.Assert_int(Grp__search__cfg, Key__link_score_max, 0); + return new Srch_db_cfg(version_id, page_count, word_count, link_count_score_max, link_count_score_cutoff, link_score_max); + } + public static void Update__bldr__link(Db_cfg_tbl cfg_tbl, Srch_db_cfg cfg, int link_score_max) { + cfg.Update_link(link_score_max); + cfg_tbl.Upsert_int(Grp__search__cfg, Key__link_score_max, link_score_max); + } + public static void Update__bldr__word(Db_cfg_tbl cfg_tbl, Srch_db_cfg cfg, int word_count, int link_count_score_max, int link_count_score_cutoff) { + cfg.Update_word(word_count, link_count_score_max, link_count_score_cutoff); + cfg_tbl.Upsert_int(Grp__search__cfg, Key__version_id, Srch_db_upgrade.Version__link_score); + cfg_tbl.Upsert_int(Grp__search__cfg, Key__word_count, word_count); + cfg_tbl.Upsert_int(Grp__search__cfg, Key__link_count_score_max, link_count_score_max); + cfg_tbl.Upsert_int(Grp__search__cfg, Key__link_count_score_cutoff, link_count_score_cutoff); + } + public static int Select__version_id(Db_cfg_tbl cfg_tbl, Srch_word_tbl word_tbl) { + int rv = cfg_tbl.Select_int_or(Grp__search__cfg, Key__version_id, -1); + if (rv >= Srch_db_upgrade.Version__link_score) return rv; // version_id exists; return it; + if (rv == Srch_db_upgrade.Version__link_score_alpha) { // R.16.03.13 has same schema as later version + rv = Srch_db_upgrade.Version__link_score; + } else { + boolean version_is_page_count = word_tbl.conn.Meta_fld_exists(word_tbl.tbl_name, "word_page_count"); + rv = version_is_page_count ? Srch_db_upgrade.Version__page_count : Srch_db_upgrade.Version__initial; + } + cfg_tbl.Upsert_int(Grp__search__cfg, Key__version_id, rv); + return rv; + } + + public static final int Link_count_score_cutoff = 300; + private static final String + Grp__search__cfg = "xowa.search.cfg" + , Key__version_id = "version_id" + , Key__word_count = "word_count" + , Key__link_count_score_max = "link_count_score_max" + , Key__link_count_score_cutoff = "link_count_score_cutoff" + , Key__link_score_max = "link_score_max" + ; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr.java new file mode 100644 index 000000000..a8e43df7b --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr.java @@ -0,0 +1,114 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.cfgs.*; +import gplx.xowa.wikis.data.*; +public class Srch_db_mgr { + private final Xow_wiki wiki; + public final Srch_db_upgrade Upgrade_mgr; + public Srch_db_mgr(Xow_wiki wiki) { + this.wiki = wiki; + Upgrade_mgr = new Srch_db_upgrade(wiki, this); + } + public Srch_db_cfg Cfg() {return cfg;} private Srch_db_cfg cfg; + public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private Db_cfg_tbl tbl__cfg; + public Srch_word_tbl Tbl__word() {return tbl__word;} private Srch_word_tbl tbl__word; + public int Tbl__link__len() {return tbl__link__ary.length;} + public Srch_link_tbl Tbl__link__get_at(int i) {return tbl__link__ary[i];} + public Srch_link_tbl[] Tbl__link__ary() {return tbl__link__ary;} private Srch_link_tbl[] tbl__link__ary = Srch_link_tbl.Ary_empty; + public Srch_db_mgr Init() { + Xowd_db_mgr db_mgr = wiki.Data__core_mgr(); + Xowd_db_file word_db = null; + if (db_mgr.Db__core().Db_props().Layout_text().Tid_is_all_or_few()) { + // single_db; core_db has search_word and search_link + word_db = db_mgr.Db__core(); + tbl__cfg = new Db_cfg_tbl(word_db.Conn(), "xowa_cfg"); + tbl__word = new Srch_word_tbl(word_db.Conn(), word_db.Db_props().Schema_is_1()); + tbl__link__ary = new Srch_link_tbl[1]; + Tbl__link__ary__set(tbl__link__ary, 0, word_db); + } else { + // many_db; figure out link_dbs + word_db = db_mgr.Dbs__get_by_tid_or_null(Srch_db_mgr_.Dbtid__search_core); + if (word_db == null) return this; // HACK: called during db build; skip; + tbl__cfg = new Db_cfg_tbl(word_db.Conn(), "xowa_cfg"); + tbl__word = new Srch_word_tbl(word_db.Conn(), word_db.Db_props().Schema_is_1()); + Ordered_hash hash = db_mgr.Dbs__get_hash_by_tid(Srch_db_mgr_.Dbtid__search_link); + if (hash == null) { // v2 file layout where search_word and search_link is in 1 search_db + tbl__link__ary = new Srch_link_tbl[1]; + Tbl__link__ary__set(tbl__link__ary, 0, word_db); + } else { // v3 file layout where search_link is in many db + int dbs_len = hash.Count(); + tbl__link__ary = new Srch_link_tbl[dbs_len]; + for (int i = 0; i < dbs_len; ++i) { + Xowd_db_file db_file = (Xowd_db_file)hash.Get_at(i); + Tbl__link__ary__set(tbl__link__ary, i, db_file); + } + } + } + cfg = Srch_db_cfg_.New(tbl__cfg, wiki.Stats().Num_pages(), Srch_db_cfg_.Select__version_id(tbl__cfg, tbl__word)); + return this; + } + public void Delete_all(Xowd_db_mgr core_data_mgr) { + tbl__word.conn.Meta_tbl_drop(Srch_link_reg_tbl.Tbl_name); + if (wiki.Data__core_mgr().Db__core().Db_props().Layout_text().Tid_is_all_or_few()) { + // single_db; just drop tables + tbl__word.conn.Meta_tbl_drop(tbl__word.tbl_name); + Srch_link_tbl link_tbl = tbl__link__ary[0]; + link_tbl.conn.Meta_tbl_drop(link_tbl.tbl_name); + } else { + // many_db; drop databases + core_data_mgr.Dbs__delete_by_tid(Xowd_db_file_.Tid_search_core); + core_data_mgr.Dbs__delete_by_tid(Xowd_db_file_.Tid_search_link); + } + } + public void Create_all() { + Xowd_db_mgr db_mgr = wiki.Data__core_mgr(); + if (wiki.Data__core_mgr().Db__core().Db_props().Layout_text().Tid_is_all_or_few()) { + // single_db; put both in core_db + Xowd_db_file search_db = db_mgr.Db__core(); + tbl__word = new Srch_word_tbl(search_db.Conn(), Bool_.N); tbl__word.Create_tbl(); + Srch_link_tbl tbl__link = new Srch_link_tbl(search_db.Conn(), Bool_.N); tbl__link.Create_tbl(); + tbl__link__ary = new Srch_link_tbl[] {tbl__link}; + Srch_link_reg_tbl tbl__lreg = new Srch_link_reg_tbl(search_db.Conn()); tbl__lreg.Create_tbl(); + Tbl__link__ary__new(tbl__lreg, tbl__link__ary, db_mgr, 0, Bool_.N, search_db); + } else { + // many_db: put in 3 db; + Xowd_db_file word_db = db_mgr.Dbs__make_by_tid(Srch_db_mgr_.Dbtid__search_core); + tbl__word = new Srch_word_tbl(word_db.Conn(), Bool_.N); tbl__word.Create_tbl(); + tbl__link__ary = new Srch_link_tbl[2]; + Srch_link_reg_tbl tbl__lreg = new Srch_link_reg_tbl(word_db.Conn()); tbl__lreg.Create_tbl(); + Tbl__link__ary__new(tbl__lreg, tbl__link__ary, db_mgr, 0, Bool_.Y, null); + Tbl__link__ary__new(tbl__lreg, tbl__link__ary, db_mgr, 1, Bool_.N, null); + } + } + private static Srch_link_tbl Tbl__link__ary__set(Srch_link_tbl[] ary, int idx, Xowd_db_file db) { + Srch_link_tbl tbl = new Srch_link_tbl(db.Conn(), db.Db_props().Schema_is_1()); + ary[idx] = tbl; + return tbl; + } + private static void Tbl__link__ary__new(Srch_link_reg_tbl lreg_tbl, Srch_link_tbl[] ary, Xowd_db_mgr db_mgr, int idx, boolean ns_ids_is_main, Xowd_db_file db) { + if (db == null) { + String ns_ids = (ns_ids_is_main ? "000" : "999"); + String suffix = "-xtn.search.link-title-ns." + ns_ids + "-db.001.xowa"; // -xtn.search.link-title-ns.main-db.001.xowa + db = db_mgr.Dbs__make_by_tid(Srch_db_mgr_.Dbtid__search_link, ns_ids, idx, suffix); + } + Srch_link_tbl tbl = Tbl__link__ary__set(ary, idx, db); + tbl.Create_tbl(); + lreg_tbl.Insert(idx, db.Id(), Srch_link_reg_tbl.Db_type__title, ns_ids_is_main ? Srch_link_reg_tbl.Ns_type__main : Srch_link_reg_tbl.Ns_type__rest, 0, -1, -1); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr_.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr_.java new file mode 100644 index 000000000..b9539236f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_mgr_.java @@ -0,0 +1,22 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.wikis.data.*; +public class Srch_db_mgr_ { + public static final byte Dbtid__search_core = 4, Dbtid__search_link = 16; // SYNC:Xowd_db_file_ +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_upgrade.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_upgrade.java new file mode 100644 index 000000000..85aa040dd --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_db_upgrade.java @@ -0,0 +1,55 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; +public class Srch_db_upgrade { + private final Xow_wiki wiki; + private boolean upgrade_prompted; + public Srch_db_upgrade(Xow_wiki wiki, Srch_db_mgr search_db_mgr) { + this.wiki = wiki; + } + public void Upgrade() { + if (!wiki.App().Mode().Tid_is_gui()) return; // ignore if html-server or drd-app + if (upgrade_prompted) return; + upgrade_prompted = true; + Xoae_app app = ((Xoae_app)wiki.App()); + boolean ok = app.Gui_mgr().Kit().Ask_ok_cancel("", "", String_.Concat_lines_nl_skip_last + ( "XOWA would like to upgrade your search database for " + wiki.Domain_str() + "." + , "" + , "* Press OK to upgrade. This may take an hour for English Wikipedia." + , "* Press Cancel to skip. You will not be able to search." + , "" + , "If you cancel, XOWA will ask you to upgrade this wiki again next time you restart the application." + , "" + , "Note that you can run this upgrade process manually by doing:" + , " Main Menu -> Tools -> Wiki Maintenance -> Search" + )); + if (!ok) return; + Xowe_wiki wikie = (Xowe_wiki)wiki; + gplx.xowa.addons.searchs.dbs.bldrs.Srch_bldr_mgr_.Setup(wikie); + gplx.xowa.bldrs.Xob_bldr bldr = app.Bldr(); + bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_alert_cmd(bldr, wikie).Msg_("search upgrade finished")); + gplx.core.threads.Thread_adp_.invk_("search_upgrade", app.Bldr(), gplx.xowa.bldrs.Xob_bldr.Invk_run).Start(); + } + public static final int + Version__link_score_alpha = 0 // in 2016-02 android alpha + , Version__initial = 1 + , Version__page_count = 2 + , Version__link_score = 3 + ; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_reg_tbl.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_reg_tbl.java new file mode 100644 index 000000000..c12c87735 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_reg_tbl.java @@ -0,0 +1,44 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.*; +public class Srch_link_reg_tbl implements Rls_able { + private final String tbl_name; public final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); + private final String fld_id, fld_db_id, fld_db_type, fld_ns_ids, fld_sub_id, fld_score_min, fld_score_max; + private final Db_conn conn; + public Srch_link_reg_tbl(Db_conn conn) { + this.conn = conn; + tbl_name = Tbl_name; + fld_id = flds.Add_int_pkey ("reg_id"); // corresponds to link_tbl_ary_idx + fld_db_id = flds.Add_int ("reg_db_id"); // corresponds to xowa_db + fld_db_type = flds.Add_int ("reg_db_type"); // "title"; "text" + fld_ns_ids = flds.Add_int ("reg_ns_ids"); // "0"; "*" + fld_sub_id = flds.Add_int ("reg_sub_id"); // "0"; "*" + fld_score_min = flds.Add_int ("reg_score_min"); // -1 + fld_score_max = flds.Add_int ("reg_score_max"); // -1 + } + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Rls() {} + public void Insert(int id, int db_id, String db_type, String ns_ids, int sub_id, int score_min, int score_max) { + Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear().Val_int(fld_id, id).Val_int(fld_db_id, db_id).Val_str(fld_db_type, db_type).Val_str(fld_ns_ids, ns_ids).Val_int(fld_sub_id, sub_id).Val_int(fld_score_min, score_min).Val_int(fld_score_max, score_max).Exec_insert(); + } + public static final String Tbl_name = "search_link_reg"; + public static final String Db_type__title = "title" , Db_type__text = "text"; + public static final String Ns_type__main = "0" , Ns_type__rest = "*"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_tbl.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_tbl.java new file mode 100644 index 000000000..55ce0f609 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_link_tbl.java @@ -0,0 +1,41 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.*; +public class Srch_link_tbl { + public final String tbl_name; + public final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); + public final String fld_word_id, fld_page_id, fld_link_score; + public final boolean schema_is_1; + public final Db_conn conn; + public Srch_link_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; this.schema_is_1 = schema_is_1; + String fld_prefix = ""; + if (schema_is_1) {tbl_name = "search_title_page"; fld_prefix = "stp_";} + else {tbl_name = "search_link";} + fld_word_id = flds.Add_int(fld_prefix + "word_id"); + fld_page_id = flds.Add_int(fld_prefix + "page_id"); + fld_link_score = flds.Add_int_dflt(fld_prefix + Fld_link_score, 0); + } + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx__page_id() {} // TODO: conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "page_id", fld_page_id));} + public void Create_idx__link_score() {conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "word_id__link_score", fld_word_id, Fld_link_score));} + + public static final Srch_link_tbl[] Ary_empty = new Srch_link_tbl[0]; + public static final String Fld_link_score = "link_score"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_temp_tbl.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_temp_tbl.java new file mode 100644 index 000000000..f47fc6b53 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_temp_tbl.java @@ -0,0 +1,45 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.*; +public class Srch_temp_tbl { + public final String tbl_name = "search_temp"; + private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); + private final String fld_word_id, fld_page_id, fld_word_text; + public final Db_conn conn; private Db_stmt stmt_insert; + public Srch_temp_tbl(Db_conn conn) { + this.conn = conn; + flds.Add_int_pkey_autonum("word_uid"); + fld_word_id = flds.Add_int("word_id"); + fld_page_id = flds.Add_int("page_id"); + fld_word_text = flds.Add_str("word_text", 255); + } + public void Insert_bgn() { + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds)); + stmt_insert = conn.Stmt_insert(tbl_name, flds); + conn.Txn_bgn("schema__search_temp__insert"); + } + public void Insert_cmd_by_batch(int word_id, int page_id, byte[] word) { + stmt_insert.Clear().Val_int(fld_word_id, word_id).Val_int(fld_page_id, page_id).Val_bry_as_str(fld_word_text, word).Exec_insert(); + } + public void Insert_end() { + conn.Txn_end(); + stmt_insert = Db_stmt_.Rls(stmt_insert); + conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_word_text, fld_page_id)); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_row.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_row.java new file mode 100644 index 000000000..e98df8f02 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_row.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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +public class Srch_word_row { + public Srch_word_row(int id, byte[] text, int link_count, int link_score_min, int link_score_max) { + this.Id = id; this.Text = text; this.Link_count = link_count; + this.Link_score_min = link_score_min; this.Link_score_max = link_score_max; + } + public final int Id; + public final byte[] Text; + public final int Link_count; + public final int Link_score_min; + public final int Link_score_max; + + public static final Srch_word_row Empty = new Srch_word_row(-1, Bry_.Empty, 0, 0, 0); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_tbl.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_tbl.java new file mode 100644 index 000000000..a48490a15 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/Srch_word_tbl.java @@ -0,0 +1,66 @@ +/* +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.addons.searchs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.dbs.*; +public class Srch_word_tbl implements Rls_able { + public final String tbl_name; + public final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); + public final String fld_id, fld_text, fld_link_count, fld_link_count_score, fld_link_score_min, fld_link_score_max; + public final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by; + public Srch_word_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_prefix = "", fld_text_name = "word_text"; + if (schema_is_1) {tbl_name = "search_title_word"; fld_prefix = "stw_"; fld_text_name = "stw_word";} + else {tbl_name = "search_word";} + this.fld_id = flds.Add_int_pkey(fld_prefix + "word_id"); + this.fld_text = flds.Add_str(fld_text_name, 255); + this.fld_link_count = flds.Add_int("link_count"); + this.fld_link_count_score = Dbmeta_fld_itm.Make_or_null(conn, flds, tbl_name, Dbmeta_fld_tid.Tid__int, 0, "link_count_score"); + this.fld_link_score_min = Dbmeta_fld_itm.Make_or_null(conn, flds, tbl_name, Dbmeta_fld_tid.Tid__int, Int_.Max_value__31, "link_score_min"); + this.fld_link_score_max = Dbmeta_fld_itm.Make_or_null(conn, flds, tbl_name, Dbmeta_fld_tid.Tid__int, 0, "link_score_max"); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx() { + // idx for rng_bgn, rng_end + conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "word_text__link_score_max__link_score_min", fld_text, Fld_link_score_max, Fld_link_score_min)); + + // idx for like + conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "link_score_max__link_score_min", Fld_link_score_max, Fld_link_score_min)); + } + public void Insert_bgn() {conn.Txn_bgn("schema__search_word__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int id, byte[] word, int page_count) {stmt_insert.Clear().Val_int(fld_id, id).Val_bry_as_str(fld_text, word).Val_int(fld_link_count, page_count).Exec_insert();} + public Srch_word_row Select_or_empty(byte[] word) { + if (stmt_select_by == null) stmt_select_by = conn.Stmt_select(tbl_name, flds, fld_text); + Db_rdr rdr = stmt_select_by.Clear().Crt_bry_as_str(fld_text, word).Exec_select__rls_manual(); + try {return rdr.Move_next() ? New_row(rdr) : Srch_word_row.Empty;} + finally {rdr.Rls();} + } + public Srch_word_row New_row(Db_rdr rdr) { + int page_count = fld_link_count == Dbmeta_fld_itm.Key_null ? 0 : rdr.Read_int(fld_link_count); + int link_score_min = fld_link_score_min == Dbmeta_fld_itm.Key_null ? page_count : rdr.Read_int(fld_link_score_min); + int link_score_max = fld_link_score_max == Dbmeta_fld_itm.Key_null ? page_count : rdr.Read_int(fld_link_score_max); + return new Srch_word_row(rdr.Read_int(fld_id), rdr.Read_bry_by_str(fld_text), page_count, link_score_min, link_score_max); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select_by = Db_stmt_.Rls(stmt_select_by); + } + public static final String Fld_link_score_min = "link_score_min", Fld_link_score_max = "link_score_max"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_cmd.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_cmd.java new file mode 100644 index 000000000..dc6e03ba7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_cmd.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.addons.searchs.dbs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; +public class Srch_bldr_cmd extends Xob_cmd__base implements Xob_cmd { + private int commit_interval = 100000, progress_interval = 10000; + public Srch_bldr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_text_search_cmd;} + @Override public void Cmd_run() { + if (!gplx.core.envs.Env_.Mode_testing()) wiki.Init_assert(); + new Srch_temp_tbl_wkr().Exec_by_cmd(wiki, commit_interval, progress_interval); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); + else if (ctx.Match(k, Invk_progress_interval_)) progress_interval = m.ReadInt("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_progress_interval_ = "progress_interval_", Invk_commit_interval_ = "commit_interval_"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_mgr_.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_mgr_.java new file mode 100644 index 000000000..5d2fd1233 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_mgr_.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.xowa.addons.searchs.dbs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; +import gplx.xowa.bldrs.*; +import gplx.xowa.addons.searchs.dbs.bldrs.cmds.*; +public class Srch_bldr_mgr_ { + public static void Setup(Xowe_wiki wiki) { + Xoae_app app = wiki.Appe(); + Xob_bldr bldr = app.Bldr(); + + bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_text_search_cmd); + int page_rank_iterations = app.Api_root().Bldr().Wiki().Import().Page_rank().Iteration_max(); + boolean page_rank_enabled = page_rank_iterations > 0; + if (page_rank_enabled) { + bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_download_cmd(bldr, wiki).Dump_type_(gplx.xowa.addons.pagelinks.bldrs.Pglnk_bldr_cmd.Dump_type_key)); + bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_wiki_page_link); + } + bldr.Cmd_mgr().Add(new Srch__page__page_score(bldr, wiki).Iteration_max_(page_rank_iterations)); + bldr.Cmd_mgr().Add(new Srch__link__link_score(bldr, wiki).Page_rank_enabled_(page_rank_enabled).Delete_plink_db_(Bool_.Y)); + bldr.Cmd_mgr().Add(new Srch__word__link_count(bldr, wiki)); + bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_delete_cmd(bldr, wiki).Patterns_ary_("*pagelinks.sql", "*pagelinks.sql.gz", "*pagelinks.sqlite3")); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_wkr.java new file mode 100644 index 000000000..f9f39a62a --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_bldr_wkr.java @@ -0,0 +1,36 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.dbs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; +import gplx.xowa.bldrs.*; +public class Srch_bldr_wkr implements Xob_page_wkr { + private final Xowe_wiki wiki; + private final Srch_temp_tbl_wkr temp_tbl_wkr = new Srch_temp_tbl_wkr(); + public Srch_bldr_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;} + public String Wkr_key() {return Xob_cmd_keys.Key_text_search_wkr;} + public void Wkr_bgn(Xob_bldr bldr) { + temp_tbl_wkr.Init(Bool_.N, wiki); + } + public void Wkr_run(gplx.xowa.wikis.data.tbls.Xowd_page_itm page) { + try {temp_tbl_wkr.Exec_by_wkr(page.Id(), page.Ttl_page_db());} + catch (Exception e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "search:error: page=~{0} err=~{1}", page.Ttl_page_db(), Err_.Message_gplx_full(e));} + } + public void Wkr_end() { + temp_tbl_wkr.Term(); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_temp_tbl_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_temp_tbl_wkr.java new file mode 100644 index 000000000..7a6958203 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/Srch_temp_tbl_wkr.java @@ -0,0 +1,171 @@ +/* +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.addons.searchs.dbs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.parsers.*; +class Srch_temp_tbl_wkr implements Srch_text_parser_wkr { + private Xowe_wiki wiki; private Xowd_db_mgr core_data_mgr; private Srch_search_addon search_addon; + private Srch_text_parser title_parser; + private Srch_temp_tbl search_temp_tbl; private int word_id, page_id; // needed for Parse_done + public Srch_temp_tbl_wkr Init(boolean cmd, Xowe_wiki wiki) { + // init + this.wiki = wiki; + this.core_data_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + this.search_addon = Srch_search_addon.Get(wiki); + this.title_parser = search_addon.Ttl_parser(); + this.word_id = 0; + // assert search_word / search_link tables + Srch_db_mgr search_db_mgr = search_addon.Db_mgr(); + if (cmd) search_db_mgr.Delete_all(core_data_mgr); // always delete if launched by cmd + search_db_mgr.Create_all(); + // start processing search_temp + this.search_temp_tbl = new Srch_temp_tbl(search_db_mgr.Tbl__word().conn); + search_temp_tbl.Insert_bgn(); + return this; + } + public void Term() { + // end inserts + search_temp_tbl.Insert_end(); + // init + Srch_db_mgr search_db_mgr = search_addon.Db_mgr(); + Db_conn word_conn = search_temp_tbl.conn; + Db_conn page_conn = wiki.Data__core_mgr().Tbl__page().conn; + // update search_word ids if they exist + Update_word_id(word_conn, wiki); + + word_conn.Exec_sql("filling search_word (please wait)", Sql__create_word); + + // create search_link + if (search_db_mgr.Tbl__link__len() == 1) { + // single_db; just run sql; + Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__ary()[0]; + new Db_attach_mgr(word_conn, new Db_attach_itm("link_db", link_tbl.conn)) + .Exec_sql(Sql__create_link__one); + link_tbl.Create_idx__page_id(); + } else { + // many_db; split into main links and non-main; ASSUME:link_dbs_is_2 + int len = search_db_mgr.Tbl__link__len(); + Db_attach_mgr attach_mgr = new Db_attach_mgr(); + for (int i = 0; i < len; ++i) { + Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__ary()[i]; + attach_mgr.Main_conn_(word_conn).Init + ( new Db_attach_itm("page_db", page_conn) + , new Db_attach_itm("link_db", link_tbl.conn)); + attach_mgr.Exec_sql(Sql__create_link__many, i == 0 ? " = 0" : " != 0"); + link_tbl.Create_idx__page_id(); + } + } + // remove search_temp + word_conn.Meta_tbl_drop(search_temp_tbl.tbl_name); + } + public void Exec_by_wkr(int page_id, byte[] page_ttl) { + this.page_id = page_id; + title_parser.Parse(this, page_ttl); + } + public void Exec_by_cmd(Xowe_wiki wiki, int commit_interval, int progress_interval) { + this.Init(Bool_.Y, wiki); + Xowd_page_tbl page_tbl = core_data_mgr.Tbl__page(); String fld_page_id = page_tbl.Fld_page_id(); String fld_page_ttl = page_tbl.Fld_page_title(); + Db_rdr page_rdr = page_tbl.Select_all__id__ttl(); int page_count = 0; + try { + while (page_rdr.Move_next()) { + this.page_id = page_rdr.Read_int(fld_page_id); + byte[] page_ttl = page_rdr.Read_bry_by_str(fld_page_ttl); + try {title_parser.Parse(this, page_ttl);} + catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "error while parsing title; id=~{0} title=~{1} err=~{2}", page_id, page_ttl, Err_.Message_gplx_log(e));} + ++page_count; + if ((page_count % commit_interval) == 0) search_temp_tbl.conn.Txn_sav(); + if ((page_count % progress_interval) == 0) Gfo_usr_dlg_.Instance.Prog_many("", "", "parse progress: count=~{0} last=~{1}", page_count, String_.new_u8(page_ttl)); + } + } finally {page_rdr.Rls();} + this.Term(); + } + public void Parse_done(Srch_word_itm word) { + search_temp_tbl.Insert_cmd_by_batch(++word_id, page_id, word.Word); + } + private void Update_word_id(Db_conn cur_conn, Xow_wiki wiki) { + // see if prv_url exists + Io_url cur_url = gplx.dbs.engines.sqlite.Sqlite_conn_info.To_url(cur_conn); // EX: /xowa/wiki/en.wikipedia.org/en.wikipedia.org-xtn.search.core.xowa + Io_url prv_url = wiki.Fsys_mgr().Root_dir().GenSubFil_nest("prv", cur_url.NameAndExt()); // EX: /xowa/wiki/en.wikipedia.org/prv/en.wikipedia.org-xtn.search.core.xowa + if (!Io_mgr.Instance.Exists(prv_url)) return; + // update ids for old_words + cur_conn.Exec_sql("UPDATE search_temp SET word_id = -1"); + Db_conn prv_conn = Db_conn_bldr.Instance.Get_or_noop(prv_url); + new Db_attach_mgr(cur_conn, new Db_attach_itm("prv_db", prv_conn)) + .Exec_sql_w_msg("updating old word ids", String_.Concat_lines_nl_skip_last + ( "UPDATE search_temp" + , "SET word_id = Coalesce((SELECT prv.word_id FROM search_word prv WHERE prv.word_text = search_temp.word_text), -1)" + )); + // assign incrementing int to new_words + int nxt_word_id = cur_conn.Exec_select_as_int("SELECT Max(word_id) AS word_id FROM search_temp", -1); if (nxt_word_id == -1) throw Err_.new_("dbs", "max_id not found"); + int uids_max = 10000; + int[] uids_ary = new int[uids_max]; int uid_last = -1; + Db_stmt update_stmt = cur_conn.Stmt_update("search_temp", String_.Ary("word_uid"), "word_id"); + while (true) { + // read 10,000 into memory + int uids_len = 0; + Db_rdr rdr = cur_conn.Exec_rdr("SELECT word_uid FROM search_temp WHERE word_id = -1 AND word_uid > " + Int_.To_str(uid_last)); + try { + while (rdr.Move_next()) { + int uid = rdr.Read_int("word_uid"); + uids_ary[uids_len++] = uid; + if (uids_len == uids_max) { + uid_last = uid; + break; + } + } + } + finally {rdr.Rls();} + if (uids_len == 0) break; + // update + for (int i = 0; i < uids_max; ++i) { + int uid = uids_ary[i]; + update_stmt.Clear().Val_int("word_id", ++nxt_word_id).Crt_int("word_uid", uid).Exec_update(); + } + } + } + private static final String + Sql__create_word = String_.Concat_lines_nl + ( "INSERT INTO search_word (word_id, word_text, link_count)" + , "SELECT word_id" + , ", word_text" + , ", Count(DISTINCT page_id)" + , "FROM search_temp" + , "GROUP BY " + , " word_text" + , ";" + ) + , Sql__create_link__one = String_.Concat_lines_nl + ( "INSERT INTO search_link (word_id, page_id)" + , "SELECT w.word_id" + , ", t.page_id" + , "FROM search_temp t" + , " JOIN search_word w ON t.word_text = w.word_text" + , ";" + ) + , Sql__create_link__many = String_.Concat_lines_nl + ( "INSERT INTO search_link (word_id, page_id)" + , "SELECT w.word_id" + , ", t.page_id" + , "FROM search_temp t" + , " JOIN search_word w ON t.word_text = w.word_text" + , " JOIN page p ON t.page_id = p.page_id" + , "WHERE p.page_namespace {0}" + , ";" + ) + ; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__link__link_score.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__link__link_score.java new file mode 100644 index 000000000..b89ccf459 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__link__link_score.java @@ -0,0 +1,182 @@ +/* +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.addons.searchs.dbs.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.dbs.bldrs.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.addons.sqlite_utils.bldrs.*; +import gplx.xowa.addons.searchs.dbs.*; +public class Srch__link__link_score extends Xob_cmd__base implements Xob_cmd { + private int score_multiplier = 100000000; + private boolean page_rank_enabled = false; + private boolean delete_plink_db = false; + public Srch__link__link_score(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + public Srch__link__link_score Page_rank_enabled_(boolean v) {this.page_rank_enabled = v; return this;} + public Srch__link__link_score Delete_plink_db_(boolean v) {this.delete_plink_db = v; return this;} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_search__link__link_score;} + @Override public void Cmd_run() { + wiki.Init_assert(); + Db_conn plink_conn = Db_conn_bldr.Instance.Get_or_autocreate(false, wiki.Fsys_mgr().Root_dir().GenSubFil(Xob_db_file.Name__page_link)); + String page_rank_tbl = Srch__page__page_score.Pagerank__tbl_name; + String log_module = "search.page.score"; + Xoa_app_.Plog_none(log_module, "adding fields to page_rank_temp"); + plink_conn.Meta_fld_assert(page_rank_tbl, "page_len" , Dbmeta_fld_tid.Itm__int, 0); + plink_conn.Meta_fld_assert(page_rank_tbl, "page_len_score" , Dbmeta_fld_tid.Itm__int, 0); + plink_conn.Meta_fld_assert(page_rank_tbl, "page_rank_score" , Dbmeta_fld_tid.Itm__double, 0); + plink_conn.Meta_fld_assert(page_rank_tbl, "page_score" , Dbmeta_fld_tid.Itm__int, 0); + int link_score_max = Srch_search_addon.Score_max; + + // percentize page_len_score to 0 : 100,000,000; NOTE: 100,000,000 so that no individual score should have 2+ page; i.e.: score_range > page_count + new Db_attach_mgr(plink_conn, new Db_attach_itm("page_db", wiki.Data__core_mgr().Tbl__page().conn)) + .Exec_sql_w_msg("filling page_rank_temp.page_len", String_.Concat_lines_nl_skip_last + ( "UPDATE page_rank_temp" + , "SET page_len = (SELECT page_len FROM page p WHERE p.page_id = page_rank_temp.page_id)" + )); + new Sqlite_percentile_cmd(bldr, wiki).Init_by_rel_url(Xob_db_file.Name__page_link, "temp_page_len", link_score_max, String_.Concat_lines_nl_skip_last + ( "SELECT p.page_id, p.page_len" + , "FROM page p" + , "ORDER BY p.page_len" // NOTE: ORDER BY is needed b/c INSERT into AUTO INCREMENT table + )).Cmd_run(); + plink_conn.Exec_sql("finalizing page_rank_temp.page_len_score", String_.Concat_lines_nl_skip_last + ( "UPDATE page_rank_temp" + , "SET page_len_score = (SELECT tpl.row_score FROM temp_page_len tpl WHERE tpl.row_key = page_rank_temp.page_id)" + )); + + // calc page_score + if (page_rank_enabled) { + // get min / max + Xoa_app_.Plog_none(log_module, "calculating page_rank range"); + double page_rank_min = plink_conn.Exec_select_as_double("SELECT Min(page_rank) FROM " + page_rank_tbl, Double_.MinValue); if (page_rank_min == Double_.MinValue) throw Err_.new_("bldr", "failed to get min; tbl=~{0}", page_rank_tbl); + double page_rank_max = plink_conn.Exec_select_as_double("SELECT Max(page_rank) FROM " + page_rank_tbl, Double_.MinValue); if (page_rank_max == Double_.MinValue) throw Err_.new_("bldr", "failed to get max; tbl=~{0}", page_rank_tbl); + double page_rank_rng = page_rank_max - page_rank_min; + if (page_rank_rng == 0) page_rank_rng = 1; // if 0, set to 1 to prevent divide by 0 below; + String score_multiplier_as_str = Dbmeta_fld_itm.To_double_str_by_int(score_multiplier); + + // normalize page_rank to 0 : 100,000,000 + plink_conn.Exec_sql + ( "normalizing page_rank_temp.page_rank_score" + , Bry_fmt.Make_str + ("UPDATE ~{tbl} SET page_rank_score = ((Coalesce(page_rank, 0)) / ~{page_score_rng}) * ~{score_multiplier}" + , page_rank_tbl, Double_.To_str(page_rank_rng), score_multiplier_as_str) + ); + + // adjust for page_len where pages in lower 60% will get penalized; EX: page_rank = 100; page_len = 50,000,000 -> 100 * (50 M / 100 M) -> 50 + String page_len_cutoff = Dbmeta_fld_itm.To_double_str_by_int((int)(score_multiplier * .6)); + plink_conn.Exec_sql + ( "penalizing short pages" + , Bry_fmt.Make_str(String_.Concat_lines_nl_skip_last + ( "UPDATE page_rank_temp" + , "SET page_rank_score = (page_rank_score * CASE WHEN page_len_score < ~{page_len_cutoff} THEN (page_len_score / ~{score_multiplier}) ELSE 1 END)" + ), page_len_cutoff, score_multiplier_as_str)); + + // percentize page_rank_score to 0 : 100,000 + new Sqlite_percentile_cmd(bldr, wiki).Init_by_rel_url(Xob_db_file.Name__page_link, "temp_page_score", link_score_max, String_.Concat_lines_nl_skip_last + ( "SELECT prt.page_id, prt.page_rank_score" + , "FROM page_rank_temp prt" + , "ORDER BY prt.page_rank_score" // NOTE: ORDER BY is needed b/c INSERT into AUTO INCREMENT table + )).Cmd_run(); + plink_conn.Exec_sql + ( "finalizing page_rank_temp.page_score" + , String_.Concat_lines_nl_skip_last + ( "UPDATE page_rank_temp" + , "SET page_score = Cast((SELECT tmp.row_score FROM temp_page_score tmp WHERE tmp.row_key = page_rank_temp.page_id) AS int)" + )); + } + else { + plink_conn.Exec_sql + ( "finalizing page_rank_temp.page_score" + , String_.Format(String_.Concat_lines_nl_skip_last + ( "UPDATE page_rank_temp" + , "SET page_score = Cast(page_len_score AS int)" + ))); + } + plink_conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_normal_by_tbl("page_rank_temp", "page_score", "page_id", "page_score")); + + // update page table + Xowd_page_tbl page_tbl = wiki.Data__core_mgr().Tbl__page(); + Db_conn page_conn = page_tbl.conn; + if (page_tbl.Fld_page_score() == Dbmeta_fld_itm.Key_null) { + page_conn.Meta_fld_append(page_tbl.Tbl_name(), Dbmeta_fld_itm.new_int(Xowd_page_tbl.Fld__page_score__key).Default_(0)); + page_tbl = wiki.Data__core_mgr().Db__core().Tbl__page__rebind(); + } + new Db_attach_mgr(page_conn, new Db_attach_itm("plink_db", plink_conn)) + .Exec_sql_w_msg("updating page.page_score", String_.Concat_lines_nl_skip_last + ( "UPDATE page" + , "SET page_score = Coalesce((SELECT Cast(pr.page_score AS integer) FROM page_rank_temp pr WHERE pr.page_id = page.page_id), 0)" + )); + + // update link tables + Srch_db_mgr search_db_mgr = Srch_search_addon.Get(wiki).Db_mgr(); + Srch_word_tbl word_tbl = search_db_mgr.Tbl__word(); + if (!page_tbl.conn.Eq(word_tbl.conn)) page_tbl.conn.Env_vacuum(); // don't vacuum if single-db + int link_tbls_len = search_db_mgr.Tbl__link__len(); + for (int i = 0; i < link_tbls_len; ++i) { + Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__get_at(i); + // update search_link.link_score + link_tbl.conn.Meta_fld_assert(link_tbl.tbl_name, Srch_link_tbl.Fld_link_score, Dbmeta_fld_tid.Itm__int, 0); + new Db_attach_mgr(link_tbl.conn + , new Db_attach_itm("page_db", page_conn) + ).Exec_sql_w_msg + ( Bry_fmt.Make_str("updating search_link.link_score: ~{idx} of ~{total}", i + 1, link_tbls_len) + , String_.Concat_lines_nl_skip_last + ( "UPDATE search_link" + , "SET link_score = Coalesce((SELECT page_score FROM page p WHERE p.page_id = search_link.page_id), 0)" + )); + + // update word_tbl.page_score_max + new Db_attach_mgr(word_tbl.conn + , new Db_attach_itm("link_db", link_tbl.conn) + ) + .Exec_sql_w_msg + ( Bry_fmt.Make_str("updating link_score_min: ~{idx} of ~{total}", i + 1, link_tbls_len) + , String_.Concat_lines_nl_skip_last + ( "REPLACE INTO search_word (word_id, word_text, link_count, link_score_min, link_score_max)" + , "SELECT sw.word_id, sw.word_text, sw.link_count, Min(sl.link_score), sw.link_score_max" + , "FROM search_word sw" + , " JOIN search_link sl ON sl.word_id = sw.word_id" + , "GROUP BY sw.word_id, sw.word_text, sw.link_count, sw.link_score_max" + , "HAVING sw.link_score_min > Min(sl.link_score)" + )) + .Exec_sql_w_msg + ( Bry_fmt.Make_str("updating link_score_max: ~{idx} of ~{total}", i + 1, link_tbls_len) + , String_.Concat_lines_nl_skip_last + ( "REPLACE INTO search_word (word_id, word_text, link_count, link_score_min, link_score_max)" + , "SELECT sw.word_id, sw.word_text, sw.link_count, sw.link_score_min, Max(sl.link_score)" + , "FROM search_word sw" + , " JOIN search_link sl ON sl.word_id = sw.word_id" + , "GROUP BY sw.word_id, sw.word_text, sw.link_count, sw.link_score_min" + , "HAVING sw.link_score_max < Max(sl.link_score)" + )) + ; + link_tbl.Create_idx__link_score(); + if (!link_tbl.conn.Eq(word_tbl.conn)) link_tbl.conn.Env_vacuum(); // don't vacuum if single-db + word_tbl.Create_idx(); + } + Srch_db_cfg_.Update__bldr__link(search_db_mgr.Tbl__cfg(), search_db_mgr.Cfg(), link_score_max); + + if (delete_plink_db) { + Xob_db_file plink_db = Xob_db_file.New__page_link(wiki); + plink_db.Conn().Rls_conn(); + Io_mgr.Instance.DeleteFil(plink_db.Url()); + } + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__page_rank_enabled_)) page_rank_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk__delete_plink_db_)) delete_plink_db = m.ReadYn("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk__page_rank_enabled_ = "page_rank_enabled_", Invk__delete_plink_db_ = "delete_plink_db_"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__page__page_score.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__page__page_score.java new file mode 100644 index 000000000..02661e2e1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__page__page_score.java @@ -0,0 +1,109 @@ +/* +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.addons.searchs.dbs.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.dbs.bldrs.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.pagelinks.dbs.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; +public class Srch__page__page_score extends Xob_cmd__base implements Xob_cmd { // create page_rank in page_db; drop and vaccuum later; avoid cross db for now + private double damping_factor = .85; + private double error_margin = .0001d; + private int iteration_max = 1000; + private Db_conn page_conn, plink_conn; + private int page_count = 0; + public Srch__page__page_score(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + public Srch__page__page_score Iteration_max_(int iteration_max) {this.iteration_max = iteration_max; return this;} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_search__page__page_score;} + @Override public void Cmd_run() { + Init__tbl(); + Calc__main(); + } + private void Init__tbl() { + wiki.Init_assert(); + this.page_conn = wiki.Data__core_mgr().Db__core().Conn(); + page_count = page_conn.Exec_select_as_int("SELECT Count(page_id) FROM page", -1); + + Xob_db_file page_link_db = Xob_db_file.New__page_link(wiki); + this.plink_conn = page_link_db.Conn(); + if (plink_conn.Meta_tbl_exists(Pagerank__tbl_name)) plink_conn.Meta_tbl_drop(Pagerank__tbl_name); + Pglnk_page_link_tbl plink_tbl = new Pglnk_page_link_tbl(plink_conn); + if (!plink_conn.Meta_tbl_exists(plink_tbl.Tbl_name())) plink_tbl.Create_tbl();// create page_link if it doesn't exist; occurs when page_rank_enabled == false; + plink_conn.Meta_tbl_create(Dbmeta_tbl_itm.New + ( Pagerank__tbl_name + , Dbmeta_fld_itm.new_int (Pagerank__fld_page_id).Primary_y_() + , Dbmeta_fld_itm.new_int (Pagerank__fld_link_count) + , Dbmeta_fld_itm.new_int (Pagerank__fld_has_converged).Default_(0) + , Dbmeta_fld_itm.new_double (Pagerank__fld_page_rank).Default_(1) + )); + + new Db_attach_mgr(plink_conn, new Db_attach_itm("page_db", page_conn)) + .Exec_sql_w_msg("generating list of pages", String_.Concat_lines_nl_skip_last + ( "INSERT INTO page_rank_temp (page_id, link_count)" + , "SELECT page_id" + , ", Coalesce(Count(pl.trg_id), {0}) AS link_count" + , "FROM page p" // NOTE: JOIN needed to filter out [[User:]] pages which are in pagelinks.sql, but not in pages-articles.xml + , " LEFT JOIN page_link pl ON p.page_id = pl.src_id" + // , "WHERE p.page_namespace = 0" + , "GROUP BY p.page_id" + ), page_count); + } + private void Calc__main() { + int iteration_idx = 0; + double damping_factor_inverse = 1 - damping_factor; + while (true) { + if (iteration_idx == iteration_max) break; + int converged_count = plink_conn.Exec_select_as_int("SELECT Count(page_id) FROM page_rank_temp WHERE has_converged = 0;", 0); + if (converged_count == 0) break; + new Db_attach_mgr(plink_conn, new Db_attach_itm("page_db", page_conn)) + .Exec_sql_w_msg(String_.Format("calculating page_rank; iteration={0} unconverged={1}", iteration_idx, converged_count) + , String_.Concat_lines_nl_skip_last + ( "REPLACE INTO page_rank_temp (page_id, page_rank, link_count, has_converged)" + , "SELECT pr.page_id" + , ", {1} + ({0} * Coalesce(w.page_rank, 0)) AS page_rank" + , ", pr.link_count" + , ", CASE WHEN Abs(pr.page_rank - ({1} + ({0} * Coalesce(w.page_rank, 0)))) < {2} THEN 1 ELSE 0 END AS has_converged" + , "FROM page_rank_temp pr" + , " LEFT JOIN" + , " (SELECT lnk.trg_id" + , " , Sum((Cast(pr2.page_rank AS double) / Cast(pr2.page_rank AS double))) * {0} AS page_rank" + , " FROM page_rank_temp pr2" + , " JOIN page_link lnk ON pr2.page_id = lnk.src_id" + , " JOIN page p ON lnk.src_id = p.page_id" + // , " WHERE p.page_namespace = 0" + , " GROUP BY lnk.trg_id" + , " ) AS w ON w.trg_id = pr.page_id" + , "WHERE pr.has_converged = 0" + ), damping_factor, damping_factor_inverse, error_margin); + ++iteration_idx; + } + Gfo_usr_dlg_.Instance.Note_many("", "", "page_rank done; iteration=~{0}", iteration_idx); + } + public static final String + Pagerank__tbl_name = "page_rank_temp" + , Pagerank__fld_page_id = "page_id" + , Pagerank__fld_page_rank = "page_rank" + , Pagerank__fld_link_count = "link_count" + , Pagerank__fld_has_converged = "has_converged" + ; + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__damping_factor_)) damping_factor = m.ReadDouble("v"); + else if (ctx.Match(k, Invk__error_margin_)) error_margin = m.ReadDouble("v"); + else if (ctx.Match(k, Invk__iteration_max_)) iteration_max = m.ReadInt("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk__damping_factor_ = "damping_factor_", Invk__error_margin_ = "error_margin_", Invk__iteration_max_ = "iteration_max_"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__word__link_count.java b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__word__link_count.java new file mode 100644 index 000000000..7302840bb --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/dbs/bldrs/cmds/Srch__word__link_count.java @@ -0,0 +1,52 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.dbs.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.dbs.bldrs.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.addons.sqlite_utils.bldrs.*; +import gplx.xowa.addons.searchs.dbs.*; +public class Srch__word__link_count extends Xob_cmd__base implements Xob_cmd { + private int score_multiplier = Srch_search_addon.Score_max; + public Srch__word__link_count(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_search__word__link_count;} + @Override public void Cmd_run() { + wiki.Init_assert(); + + Srch_db_mgr search_db_mgr = Srch_search_addon.Get(wiki).Db_mgr(); + Srch_word_tbl word_tbl = search_db_mgr.Tbl__word(); + Db_conn word_conn = word_tbl.conn; + String percentile_tbl = "search_word__link_count"; + Sqlite_percentile_cmd percentile_cmd = new Sqlite_percentile_cmd(bldr, wiki).Init_by_conn(word_conn, percentile_tbl, score_multiplier, String_.Concat_lines_nl_skip_last + ( "SELECT sw.word_id, sw.link_count" + , "FROM search_word sw" + , "ORDER BY sw.link_count" // NOTE: ORDER BY is needed b/c INSERT into AUTO INCREMENT table + )); + percentile_cmd.Cmd_run(); + + word_conn.Exec_sql("finalizing search_word.link_count_score", String_.Concat_lines_nl_skip_last + ( "UPDATE search_word" + , "SET link_count_score = (SELECT tpl.row_score FROM search_word__link_count tpl WHERE tpl.row_key = search_word.word_id)" + )); + word_conn.Meta_tbl_drop(percentile_tbl); + word_conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(word_tbl.tbl_name, "link_count_score__word_text", word_tbl.fld_link_count_score, word_tbl.fld_text)); + + int link_count_score_cutoff = word_conn.Exec_select_as_int("SELECT Cast(Min(link_count_score) AS int) AS val FROM search_word WHERE link_count > " + Int_.To_str(Srch_db_cfg_.Link_count_score_cutoff), 0); + Srch_db_cfg_.Update__bldr__word(search_db_mgr.Tbl__cfg(), search_db_mgr.Cfg(), percentile_cmd.count, score_multiplier, link_count_score_cutoff); + word_conn.Env_vacuum(); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return this;} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr.java new file mode 100644 index 000000000..9d1e0cfde --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr.java @@ -0,0 +1,117 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.btries.*; +import gplx.xowa.langs.cases.*; +public class Srch_highlight_mgr { + private final Xol_case_mgr case_mgr; + private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); + private Srch_highlight_itm[] srch_lc_itms; + private int srch_words_len; + public Srch_highlight_mgr(Xol_case_mgr case_mgr) {this.case_mgr = case_mgr;} + public Srch_highlight_mgr Search_(byte[] srch_mc_bry) { + synchronized (tmp_bfr) { + // build array of search_words + byte[] srch_lc_bry = case_mgr.Case_build_lower(srch_mc_bry); + byte[][] srch_lc_ary = Bry_split_.Split(srch_lc_bry, Byte_ascii.Space, Bool_.Y); + this.srch_words_len = srch_lc_ary.length; + this.srch_lc_itms = new Srch_highlight_itm[srch_words_len]; + for (int i = 0; i < srch_words_len; ++i) { + byte[] srch_lc_itm = srch_lc_ary[i]; + srch_lc_itms[i] = new Srch_highlight_itm(i, srch_lc_itm); + } + + // sort to search first by longest search_word; needed for searches like "A Abc" and titles like "Abc A", else "A" will match "Abc" and "Abc" will match nothing + Array_.Sort(srch_lc_itms, Srch_highlight_bry_sorter.Instance); + return this; + } + } + public byte[] Highlight(byte[] page_mc_bry) { + synchronized (tmp_bfr) { + byte[][] page_mc_words = Bry_split_.Split(page_mc_bry, Byte_ascii.Space, Bool_.Y); + byte[][] page_lc_words = Bry_split_.Split(case_mgr.Case_build_lower(page_mc_bry), Byte_ascii.Space, Bool_.Y); + int page_words_len = page_lc_words.length; + boolean[] page_words_done = new boolean[page_words_len]; + + // loop over search_words; EX: search_raw="a b" -> "a", "b" + for (int i = 0; i < srch_words_len; ++i) { + Srch_highlight_itm srch_lc_itm = srch_lc_itms[i]; + byte[] srch_lc_word = srch_lc_itm.Word; + + // loop over page_title words; EX: page_raw="A B C" -> "a", "b", "c" + for (int j = 0; j < page_words_len; ++j) { + byte[] page_lc_word = page_lc_words[j]; + int find_pos = Bry_find_.Find_fwd(page_lc_word, srch_lc_word); + + // skip: search is not in page; EX: page_raw="D e"; should not happen, but exit now else Array out of bounds exception below + if (find_pos == Bry_find_.Not_found) continue; + + // skip: find_pos is not BOS and prv byte is not dash or paren; EX: "Za" should be skipped; "-a" and "(a" should not + if (find_pos > 0) { + byte prv_byte = page_lc_word[find_pos - 1]; + if ( prv_byte != Byte_ascii.Dash + && prv_byte != Byte_ascii.Paren_bgn + ) + continue; + } + + // skip: item already matched; EX: "a"; "a a" + if (page_words_done[j]) continue; + page_words_done[j] = true; + + // NOTE: lc_idx is guaranteed to equal mc_idx + byte[] page_mc_word = page_mc_words[j]; + int srch_lc_word_len = srch_lc_word.length; + + // build new word; EX: "A" + tmp_bfr.Clear(); + tmp_bfr.Add_mid(page_mc_word, 0, find_pos); + tmp_bfr.Add(gplx.langs.htmls.Gfh_tag_.Strong_lhs); + tmp_bfr.Add_mid(page_mc_word, find_pos, find_pos + srch_lc_word_len); + tmp_bfr.Add(gplx.langs.htmls.Gfh_tag_.Strong_rhs); + tmp_bfr.Add_mid(page_mc_word, find_pos + srch_lc_word_len, page_mc_word.length); + byte[] repl = tmp_bfr.To_bry_and_clear(); + + // overwrite page_title word + page_mc_words[j] = repl; + } + } + + // rebuild page_words ary + for (int i = 0; i < page_words_len; ++i) { + if (i != 0) tmp_bfr.Add_byte_space(); // NOTE: this assumes one space separating titles which is true for all MW titles + tmp_bfr.Add(page_mc_words[i]); + } + return tmp_bfr.To_bry_and_clear(); + } + } +} +class Srch_highlight_itm { + public Srch_highlight_itm(int idx, byte[] word) {this.Idx = idx; this.Word = word; this.Word_len = word.length;} + public final int Idx; + public final byte[] Word; + public final int Word_len; +} +class Srch_highlight_bry_sorter implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Srch_highlight_itm lhs = (Srch_highlight_itm)lhsObj; + Srch_highlight_itm rhs = (Srch_highlight_itm)rhsObj; + return -Int_.Compare(lhs.Word_len, rhs.Word_len); // - for descending + } + public static final Srch_highlight_bry_sorter Instance = new Srch_highlight_bry_sorter(); Srch_highlight_bry_sorter() {} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr_tst.java new file mode 100644 index 000000000..9c4bccfcc --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_highlight_mgr_tst.java @@ -0,0 +1,47 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import org.junit.*; import gplx.xowa.langs.cases.*; +public class Srch_highlight_mgr_tst { + private final Srch_highlight_mgr_tstr tstr = new Srch_highlight_mgr_tstr(); + @Test public void Full__one() {tstr.Test("a" , "A" , "A");} + @Test public void Full__many() {tstr.Test("a b" , "A B" , "A B");} + @Test public void Part__one() {tstr.Test("a" , "A1" , "A1");} + @Test public void Part__many() {tstr.Test("a b" , "A1 B1" , "A1 B1");} + @Test public void Unordered() {tstr.Test("b a" , "A1 B1" , "A1 B1");} + @Test public void Repeat__part() {tstr.Test("a ab" , "Ab A" , "Ab A");} + @Test public void Repeat__full() {tstr.Test("a" , "A A" , "A A");} + @Test public void Close() {tstr.Test("a" , "Ba Aa" , "Ba Aa");} + @Test public void Comma() {tstr.Test("a" , "A, b" , "A, b");} + @Test public void Dash() {tstr.Test("b" , "A-B c" , "A-B c");} + @Test public void Parens() {tstr.Test("a" , "(A)" , "(A)");} + @Test public void Strong() {tstr.Test("strong" , "strong strong" , "strong strong");} + @Test public void Dash_w_mixed_cases() {tstr.Test("b" , "A-a B" , "A-a B");} // search_parser treats A-a separately from a-a + @Test public void Acronymn() {tstr.Test("ab" , "A.B." , "A.B.");} + // @Test public void Slash() {tstr.Test("b" , "A/B/C" , "A/B/C");} +} +class Srch_highlight_mgr_tstr { + private final Srch_highlight_mgr mgr; + private final Xol_case_mgr case_mgr = Xol_case_mgr_.A7(); + public Srch_highlight_mgr_tstr() { + mgr = new Srch_highlight_mgr(case_mgr); + } + public void Test(String search, String title, String expd) { + Tfds.Eq(expd, String_.new_u8(mgr.Search_(Bry_.new_u8(search)).Highlight(Bry_.new_u8(title)))); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_sym_parser.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_sym_parser.java new file mode 100644 index 000000000..a5b9af24f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_sym_parser.java @@ -0,0 +1,262 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.btries.*; import gplx.core.primitives.*; +interface Srch_sym_parser { + int Tid(); + byte[][] Hooks_ary(); + int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end); +} +class Srch_sym_parser_ { + public static final int Tid__terminal = 1, Tid__split = 2, Tid__enclosure = 3, Tid__dot = 4, Tid__ellipsis = 5, Tid__apos = 6, Tid__dash = 7; +} +class Srch_sym_parser__terminal implements Srch_sym_parser { + public Srch_sym_parser__terminal(byte[] hook_bry) {this.hooks_ary = Bry_.Ary(hook_bry);} + public int Tid() {return Srch_sym_parser_.Tid__terminal;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + if (mgr.Cur__end__chk(hook_end)) { // hook at word_end; EX: "a, b" -> "a", "b" + int word_bgn = mgr.Cur__bgn(); + if (word_bgn == Srch_text_parser.None) return hook_end; + int word_end = hook_bgn; + for (int i = hook_bgn - 1; i >= word_bgn; --i) { // loop bwd to gobble up streams of terminals; EX: "?!" + byte b = src[i]; + if (mgr.word_end_trie.Match_bgn_w_byte(b, src, i, hook_bgn) == null) break; + word_end = i; + } + mgr.Words__add_if_pending_and_clear(word_end); // make word; note that " , " will not make word b/c word_bgn == -1 + return hook_end; + } + else {}// hook at word_mid or word_bgn; noop; EX: "1,000" -> "1,000"; note that " ,abc" will ignore "," +// if (mgr.Cur__bgn() == - 1) { +// mgr.Cur__bgn__set(hook_bgn); +// } +// } + return hook_end; + } +} +class Srch_sym_parser__split implements Srch_sym_parser { + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); + private final boolean handle_eos; + public Srch_sym_parser__split(boolean handle_eos, String... hooks_ary_as_str) { + this.handle_eos = handle_eos; + this.hooks_ary = Bry_.Ary(hooks_ary_as_str); + int hooks_len = hooks_ary.length; + for (int i = 0; i < hooks_len; ++i) { + byte[] hook = hooks_ary[i]; + trie.Add_obj(hook, Int_obj_val.new_(hook.length)); + } + } + public int Tid() {return Srch_sym_parser_.Tid__split;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + mgr.Words__add_if_pending_and_clear(hook_bgn); + + int rv = hook_end; + while (rv < src_end) { // loop to skip multiple syms in same group; EX: "a \n\t\r b" + byte b = src[rv]; + Object o = trie.Match_bgn_w_byte(b, src, rv, src_end); + if (o == null) break; // current sequence is not in grp; stop + Int_obj_val itm_len = (Int_obj_val)o; + rv += itm_len.Val(); // add len of sym to pos + } + return rv; + } + public int Find_fwd(byte[] src, int src_bgn, int src_end) { + for (int i = src_bgn; i < src_end; ++i) { + byte b = src[i]; + Object o = trie.Match_bgn_w_byte(b, src, i, src_end); + if (o != null) return i; + } + return src_end; + } + public boolean Is_next(byte[] src, int pos, int end) { + if (pos >= end) return handle_eos; + byte b = src[pos]; + Object o = trie.Match_bgn_w_byte(b, src, pos, end); + return o != null; + } +} +class Srch_sym_parser__paren_bgn implements Srch_sym_parser { + private final byte bgn_byte, end_byte; + public Srch_sym_parser__paren_bgn(byte bgn_byte, byte end_byte) { + this.bgn_byte = bgn_byte; this.end_byte = end_byte; + this.hooks_ary = Bry_.Ary(Bry_.New_by_byte(bgn_byte)); + } + public int Tid() {return Srch_sym_parser_.Tid__enclosure;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int paren_lhs_bgn, int paren_lhs_end) { + int word_bgn = mgr.Cur__bgn(); + paren_lhs_end = Bry_find_.Find_fwd_while(src, paren_lhs_end, src_end, bgn_byte); + int paren_rhs_bgn = Bry_find_.Find_fwd(src, end_byte, paren_lhs_end, src_end); + if (paren_rhs_bgn == Bry_find_.Not_found) return paren_lhs_end; // paren_rhs missing; noop; NOTE: handles both "a(b" -> "a(b" and "a (b" -> "a", "b" + int paren_rhs_end = Bry_find_.Find_fwd_while(src, paren_rhs_bgn, src_end, end_byte); + int word_end = mgr.Cur__end__find__text_only(paren_lhs_end + 1); + if (word_end < paren_rhs_bgn) + word_end = mgr.Cur__end__find__text_only(paren_rhs_end); + boolean recurse = false; + if (word_bgn == -1) { // paren_lhs at word_bgn; EX: "a (b)" + if (word_end == paren_rhs_end) // paren_rhs at word_end; EX: "a (b) c" + recurse = true; + else { // paren_rhs at word_mid; EX: "a (b)c" + mgr.Words__add_direct(paren_lhs_bgn, word_end); + mgr.Words__add_direct(paren_rhs_end, word_end); + } + } + else { // paren_lhs at word_mid; EX: "a(b)" + mgr.Words__add_direct(word_bgn, word_end); + if (word_end == paren_rhs_end) // paren_rhs at word_end; EX: "a(b) c" + mgr.Words__add_direct(word_bgn, paren_lhs_bgn); + else {} // paren_rhs at word_mid; EX: "a (b)c" + mgr.Cur__bgn__reset(); + } + if (recurse) + mgr.Make_copy().Parse(mgr.lcase, src, paren_lhs_end, paren_rhs_bgn); + return word_end; + } +} +class Srch_sym_parser__dot implements Srch_sym_parser { // handle periods which will add two entries; EX: "H. G. Wells" -> "H.", "G.", "H", "G", "Wells" + private final byte[] sym; private final int sym_len; + public Srch_sym_parser__dot(String sym_str) {this.sym = Bry_.new_u8(sym_str); this.sym_len = sym.length;} + public int Tid() {return Srch_sym_parser_.Tid__dot;} + public byte[][] Hooks_ary() {return Hooks_const;} private static final byte[][] Hooks_const = Bry_.Ary("."); + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + int word_bgn = mgr.Cur__bgn(); + if (word_bgn == -1) { // dot at start of word; EX: ".NET", "Colt .45" + int word_end = mgr.Cur__end__find(hook_bgn + 1); + if (word_end - hook_bgn == 1) return hook_end; // ignore stand-alone sym; EX: "a . . . b" + mgr.Words__add__chk_dash(hook_bgn, word_end); // make word; EX: ".45" + if (Bry_find_.Find_fwd(src, sym, hook_bgn + 1, word_end) == -1) // only add "root" word, if sym is not in middle of String; EX: ".int" -> "int"; ".A.B" x> "A.B" + mgr.Words__add__chk_dash(hook_bgn + 1, word_end); // make word; EX: "45" + mgr.Cur__bgn__reset(); + return word_end; + } + else { + if (mgr.Cur__end__chk(hook_end)) { // at end of word; EX: "U.S.A. b" vs. "H. G. b" + mgr.Words__add__chk_dash(word_bgn, hook_end); // make word; EX: "vs." + if (Bry_find_.Find_fwd(src, sym, word_bgn, hook_bgn) == -1) // no dots in word; add "root" word; "vs." -> "vs.", "vs"; "U.S.A." -> "U.S.A." x> "U.S.A" + mgr.Words__add__chk_dash(word_bgn, hook_bgn); // make word; EX: "vs" + else { + for (int i = word_bgn; i < hook_end; ++i) { // dots in middle of String; extract word; EX: "U.S.A." -> USA + if (Bry_.Eq(src, i, i + sym_len, sym)) continue;// skip syms + mgr.Tmp_bfr.Add_byte(src[i]); + } + mgr.Words__add_direct(mgr.Tmp_bfr.To_bry_and_clear()); + } + mgr.Cur__bgn__reset(); + } + } + return hook_end; + } +} +class Srch_sym_parser__ellipsis implements Srch_sym_parser { // ellipsis which have variable length; EX: "..", "...", ".... " + private final byte ellipsis_byte; + public Srch_sym_parser__ellipsis(byte ellipsis_byte, String hook) { + this.ellipsis_byte = ellipsis_byte; + this.hooks_ary = Bry_.Ary(hook); + } + public int Tid() {return Srch_sym_parser_.Tid__ellipsis;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + mgr.Words__add_if_pending_and_clear(hook_bgn); // add word; EX: "Dreams" in "Dreams..." + int rv = Bry_find_.Find_fwd_while(src, hook_end, src_end, ellipsis_byte); // skip multiple ellipsis; EX: ...... + mgr.Words__add__chk_dash(hook_bgn, rv); // add ellipsis + return rv; + } +} +class Srch_sym_parser__apos implements Srch_sym_parser { // apos which can be contraction ("I'm"), possessive ("today's") and plural ("plans'") + private final byte[] hook_bry; + public Srch_sym_parser__apos(String hook) { + this.hook_bry = Bry_.new_u8(hook); + this.hooks_ary = Bry_.Ary(hook_bry); + } + public int Tid() {return Srch_sym_parser_.Tid__apos;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + int word_bgn = mgr.Cur__bgn(); + int word_end = -1; + if (word_bgn == -1) { // sym at word_bgn; EX: "'n'" + word_bgn = hook_bgn; + word_end = mgr.Cur__end__find(hook_bgn + 1); + mgr.Words__add__chk_dash(word_bgn, word_end); + + // "'n'" -> "n" + int alt_word_bgn = word_bgn + 1; + int alt_word_end = Bry_find_.Find_bwd__skip(src, word_end, alt_word_bgn, hook_bry); + if (alt_word_end - alt_word_bgn > 0) // do not add if 0-len; EX: "' (disambiguation)" + mgr.Words__add__chk_dash(alt_word_bgn, alt_word_end); + mgr.Cur__bgn__reset(); + return word_end; + } + word_end = mgr.Cur__end__find(hook_end); + if (hook_end == word_end) { // sym at word_end; EX: "A' " + mgr.Words__add_if_pending_and_clear(hook_bgn); // add root only; EX: "a'" -> "a" x> "a", "a'" + return hook_end; + } + else { + byte[] root_word = null; + if (hook_bgn - word_bgn == 1) + root_word = mgr.Tmp_bfr.Add_byte(src[word_bgn]).Add_mid(src, hook_bgn + 1, word_end).To_bry_and_clear(); + else if (word_end - hook_end == 1) + root_word = mgr.Tmp_bfr.Add_mid(src, word_bgn, hook_bgn).Add_byte(src[hook_end]).To_bry_and_clear(); + // Tfds.Write(word_bgn, hook_bgn, hook_end, word_end); + if (root_word != null) { + mgr.Words__add__chk_dash(word_bgn, word_end); // add full; EX: "o'clock" + mgr.Words__add_direct(root_word); // add root; EX: "oclock" + mgr.Cur__bgn__reset(); + } + return word_end; + } + } +} +class Srch_sym_parser__dash implements Srch_sym_parser { + public Srch_sym_parser__dash(String hook) {this.hooks_ary = Bry_.Ary(hook);} + public int Tid() {return Srch_sym_parser_.Tid__dash;} + public byte[][] Hooks_ary() {return hooks_ary;} private final byte[][] hooks_ary; + public int Parse(Srch_text_parser mgr, byte[] src, int src_end, int hook_bgn, int hook_end) { + int cur_bgn = mgr.Cur__bgn(); // get word_bgn + if (cur_bgn == -1) { // no word_bgn; "-" is 1st char + if (mgr.Cur__end__chk(hook_end)) { // next char is space + mgr.Words__add_direct(hook_bgn, hook_end); // add dash; EX: "a - b" -> "a", "-", "b" + } + else { // next char is something else + mgr.Cur__bgn__set(hook_bgn); // update word_bgn to dash + mgr.Dash__bgn_(hook_end); + } + return hook_end; + } + else { // word_bgn exists + int dash_bgn = mgr.Dash__bgn(); + if (dash_bgn == Srch_text_parser.None) { // 1st dash + mgr.Words__add__chk_dash(cur_bgn, hook_bgn);// add word; EX: "a" in "a-b" + } else { // 2nd or more; add stub; EX: "a-b-c"; 2nd "-" should add "b" + if (hook_bgn > dash_bgn) // only add if len > 0; handles multiple dashes; EX: "---" + mgr.Words__add_direct(dash_bgn, hook_bgn); + } + } + mgr.Dash__bgn_(hook_end); + return hook_end; + } + public void Add_pending_word(Srch_text_parser mgr, byte[] src, int word_end) { + int dash_bgn = mgr.Dash__bgn(); + if (dash_bgn == Srch_text_parser.None) return; + if (word_end - dash_bgn > 0) // only add if there is word to right of dash; EX: "a-" + mgr.Words__add_direct(dash_bgn, word_end); + mgr.Dash__bgn_(Srch_text_parser.None); // clear the dash + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser.java new file mode 100644 index 000000000..2b09d538f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser.java @@ -0,0 +1,173 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.btries.*; import gplx.xowa.langs.cases.*; +public class Srch_text_parser { + private Btrie_slim_mgr parser_trie = Btrie_slim_mgr.cs(); public Btrie_slim_mgr word_end_trie = Btrie_slim_mgr.cs(); private Btrie_slim_mgr word_bgn_trie = Btrie_slim_mgr.cs(); + private Xol_case_mgr case_mgr; + public final Bry_bfr Tmp_bfr = Bry_bfr.new_(32); + private byte[] src; private int end; + private Srch_sym_parser__split parser__ws; private Srch_sym_parser__dash parser__dash; + public Srch_word_hash word_hash = new Srch_word_hash(); + public boolean lcase = true; + public Srch_text_parser Init_for_ttl(Xol_case_mgr case_mgr) { + this.case_mgr = case_mgr; + parser_trie.Clear(); word_end_trie.Clear(); + parser__ws = new Srch_sym_parser__split(Bool_.Y, " ", "\t", "\n", "\r", "_"); + parser__dash = new Srch_sym_parser__dash("-"); + Parsers__reg(Parsers__make__word_end + ( "!", "?", ",", ":", ";", "\"", "~" + //, "@", "&", "*", "`", "+" // should add for symmetry of word_bgn trie but strips "@Home" to "Home" only; also, several have many "*", "`", "+" + )); + Parsers__reg(new Srch_sym_parser__split(Bool_.N, "/")); + Parsers__reg(parser__ws, parser__dash + , new Srch_sym_parser__paren_bgn(Byte_ascii.Paren_bgn, Byte_ascii.Paren_end) + , new Srch_sym_parser__dot("."), new Srch_sym_parser__ellipsis(Byte_ascii.Dot, ".."), new Srch_sym_parser__apos("'")); // NOTE: [ ] { } do not exist in titles + word_bgn_trie.Add_many_int(1 + // , "!", "?", ",", ":", ";" // low #; should add for symmetry of word_end trie; + , "\"" // adding for symmetry of word_end trie; + , "@", "&", "*", "`", "~", "+" // "@Home", "&c.", "&NSYNC", "Muhammad_ibn_`Ali_at-Tirmidhi"; "Phantom_~Requiem_for_the_Phantom~"; "+pool" + ); + return this; + } + public Srch_text_parser Make_copy() { + Srch_text_parser rv = new Srch_text_parser(); + rv.parser_trie = parser_trie; rv.word_end_trie = word_end_trie; rv.word_bgn_trie = word_bgn_trie; + rv.parser__ws = parser__ws; rv.parser__dash = parser__dash; + rv.word_hash = word_hash; rv.case_mgr = case_mgr; + rv.lcase = lcase; + return rv; + } + public byte[][] Parse_to_bry_ary(boolean lcase, byte[] src_orig) { + word_hash.Clear(); + this.lcase = lcase; + Parse(lcase, src_orig, 0, src_orig.length); + int hash_len = word_hash.Len(); + byte[][] rv = new byte[hash_len][]; + for (int i = 0; i < hash_len; ++i) { + Srch_word_itm itm = (Srch_word_itm)word_hash.Get_at(i); + rv[i] = itm.Word; + } + return rv; + } + public void Parse(Srch_text_parser_wkr wkr, byte[] src_orig) { + word_hash.Clear(); + Parse(Bool_.Y, src_orig, 0, src_orig.length); + int hash_len = word_hash.Len(); + for (int i = 0; i < hash_len; ++i) { + Srch_word_itm itm = (Srch_word_itm)word_hash.Get_at(i); + wkr.Parse_done(itm); + } + } + public void Parse(boolean lcase, byte[] src_orig, int bgn, int end_orig) { + this.src = lcase ? case_mgr.Case_build_lower(src_orig) : src_orig; + this.end = end_orig + (src.length - src_orig.length); + this.cur_bgn = dash_bgn = Srch_text_parser.None; + int pos = bgn; + while (true) { + boolean pos_is_last = pos == end; + if (pos_is_last) { // EOS and pending word; add it + if (cur_bgn != -1) + Words__add__chk_dash(cur_bgn, end); + break; + } + byte b = src[pos]; + Object o = parser_trie.Match_bgn_w_byte(b, src, pos, end); + if (o == null) { // unknown sequence; word-char + if (cur_bgn == -1) cur_bgn = pos; // set 1st char for word + ++pos; + } + else { + Srch_sym_parser parser = (Srch_sym_parser)o; + pos = parser.Parse(this, src, end, pos, parser_trie.Match_pos()); + } + } + } + public int Cur__bgn() {return cur_bgn;} private int cur_bgn; public void Cur__bgn__reset() {this.cur_bgn = -1;} + public void Cur__bgn__set(int v) {this.cur_bgn = v;} // called from dash parser + public int Dash__bgn() {return dash_bgn;} private int dash_bgn; public void Dash__bgn_(int v) {this.dash_bgn = v;} + public int Cur__end__find(int pos) {return parser__ws.Find_fwd(src, pos, end);} + public boolean Cur__end__chk(int pos) {return parser__ws.Is_next(src, pos, end);} + public int Cur__end__find__text_only(int pos) { // primarily for parens and finding word_end after ")"; EX: "(city), " vs "(a)b " + while (pos < end) { + byte b = src[pos]; + Object parser_obj = parser_trie.Match_bgn_w_byte(b, src, pos, end); + if (parser_obj == null) // b is text; increment by 1 and continue searching + ++pos; + else // b is some sort of symbol; end word here; EX: "a," should produce "a", not "a," + return pos; + } + return end; + } + public void Words__add_if_pending_and_clear(int word_end) { + if (cur_bgn == -1) return; // exit; no pending words + this.Words__add__chk_dash(cur_bgn, word_end); + cur_bgn = -1; + } + public void Words__add__chk_dash(int word_bgn, int word_end) { + parser__dash.Add_pending_word(this, src, word_end); + byte[] word = Bry_.Mid(src, word_bgn, word_end); + Words__add_direct(word); + } + public void Words__add_direct(int bgn, int end) {Words__add_direct(Bry_.Mid(src, bgn, end));} + public void Words__add_direct(byte[] bry) { + word_hash.Add(bry); + + // remove punctuation at bgn of word; EX: "@Home" -> "Home" + boolean dirty = false; + int pos = 0; int len = bry.length; + while (pos < len) { + byte b = bry[pos]; + if (word_bgn_trie.Match_bgn_w_byte(b, bry, pos, len) != null) { // b is symbol; + dirty = true; + pos = word_bgn_trie.Match_pos(); + } + else { + break; + } + } + if (dirty && pos < len) { + byte[] trunc = Bry_.Mid(bry, pos, len); + // if (!word_hash.Has(trunc)) // don't add if it exists; EX: "'tis" + word_hash.Add(trunc); + } + } + + private void Parsers__reg(Srch_sym_parser... parsers_ary) { + int parsers_len = parsers_ary.length; + for (int i = 0; i < parsers_len; ++i) { + Srch_sym_parser parser = parsers_ary[i]; + byte[][] hooks_ary = parser.Hooks_ary(); + int hooks_len = hooks_ary.length; + for (int j = 0; j < hooks_len; ++j) { + byte[] hook = hooks_ary[j]; + parser_trie.Add_obj(hook, parser); + if (parser.Tid() == Srch_sym_parser_.Tid__terminal) + word_end_trie.Add_obj(hook, parser); + } + } + } + private static Srch_sym_parser[] Parsers__make__word_end(String... hooks) { + int rv_len = hooks.length; + Srch_sym_parser[] rv = new Srch_sym_parser[rv_len]; + for (int i = 0; i < rv_len; ++i) + rv[i] = new Srch_sym_parser__terminal(Bry_.new_u8(hooks[i])); + return rv; + } + public static final int None = -1; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_tst.java new file mode 100644 index 000000000..ad1208ba3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_tst.java @@ -0,0 +1,147 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import org.junit.*; import gplx.xowa.langs.cases.*; +public class Srch_text_parser_tst { + private final Srch_text_parser_fxt fxt = new Srch_text_parser_fxt(); + @Before public void init() {fxt.Init();} + @Test public void Word__one() {fxt.Clear().Test__split("abcd" , "abcd");} + @Test public void Word__many() {fxt.Clear().Test__split("abc d ef" , "abc", "d", "ef");} + @Test public void Ws__many() {fxt.Clear().Test__split("a b" , "a", "b");} + @Test public void Ws__bgn() {fxt.Clear().Test__split(" a" , "a");} + @Test public void Ws__end() {fxt.Clear().Test__split("a " , "a");} + @Test public void Under() {fxt.Clear().Test__split("a_b" , "a", "b");} // NOTE: same as space + @Test public void Lowercase() {fxt.Clear().Test__split("A B C" , "a", "b", "c");} + @Test public void Dupe() {fxt.Clear().Test__split("a a a" , fxt.Make_word("a", 3));} + @Test public void Dupe__lowercase() {fxt.Clear().Test__split("a A" , fxt.Make_word("a", 2));} + @Test public void Comma__end() {fxt.Clear().Test__split("a, b" , "a", "b");} // EX: "Henry VI, Part 3"; "Bergen County, New Jersey" + @Test public void Comma__mid() {fxt.Clear().Test__split("a,b" , "a,b");} // EX: "20,000 Leagues Under the Sea" + @Test public void Comma__bgn() {fxt.Clear().Test__split(",a b" , "a", "b");} // EX: skip bad usages; EX: "Little Harbour,Pictou ,Nova Scotia"; "The Hindu Succession Act ,1956" + @Test public void Colon__end() {fxt.Clear().Test__split("a: b" , "a", "b");} + @Test public void Colon__mid() {fxt.Clear().Test__split("a:b" , "a:b");} // EX: "3:10 to Yuma (2007 film)"; "6:02 AM EST"; "24:7 Theatre Festival"; "Library of Congress Classification:Class P -- Language and Literature" + @Test public void Colon__bgn() {fxt.Clear().Test__split(":a b" , "a", "b");} + @Test public void Semic__end() {fxt.Clear().Test__split("a; b" , "a", "b");} + @Test public void Semic__mid() {fxt.Clear().Test__split("a;b" , "a;b");} + @Test public void Semic__bgn() {fxt.Clear().Test__split(";a b" , "a", "b");} + @Test public void Bang__end() {fxt.Clear().Test__split("a! b" , "a", "b");} + @Test public void Bang__mid() {fxt.Clear().Test__split("a!b" , "a!b");} + @Test public void Bang__bgn() {fxt.Clear().Test__split("!a b" , "a", "b");} + @Test public void Question__end() {fxt.Clear().Test__split("a? b" , "a", "b");} + @Test public void Question__mid() {fxt.Clear().Test__split("a?b" , "a?b");} + @Test public void Question__bgn() {fxt.Clear().Test__split("?a b" , "a", "b");} + @Test public void Question__sentence() {fxt.Clear().Test__split("a?" , "a");} + @Test public void Multiple__1() {fxt.Clear().Test__split("a?!" , "a");} + @Test public void Multiple__2() {fxt.Clear().Test__split("a!?" , "a");} + @Test public void Dot__word() {fxt.Clear().Test__split("a.org" , "a.org");} // EX: "en.wikipedia.org"; "Earth.png"; "IEEE_802.15" + @Test public void Dot__abrv() {fxt.Clear().Test__split("a vs. b" , "a", "vs.", "vs", "b");} // EX: "vs.", "no.", "dr.", "st.", "inc." + @Test public void Dot__initials() {fxt.Clear().Test__split("a. b. cde" , "a.", "a", "b.", "b", "cde");} // EX: "H. G. Wells" + @Test public void Dot__acronym() {fxt.Clear().Test__split("abc D.E.F. ghi" , "abc", "d.e.f.", "def", "ghi");} // EX: "History of U.S.A. Science", "G.I. Bill", "Washington, D.C."; "Barcelona F.C."; "The Office (U.S.)"; "Agents of S.H.I.E.L.D."; "Gunfight at the O.K. Corral"; "H.M.S. Pinafore"; "R.E.M. discography" + @Test public void Dot__bgn() {fxt.Clear().Test__split("a .bcd e" , "a", ".bcd", "bcd", "e");} // EX: "Colt .45", "List of organizations with .int domain names" + @Test public void Dot__bgn__end() {fxt.Clear().Test__split("a .b. c" , "a", ".b.", "c");} + @Test public void Dot__ellipsis_like() {fxt.Clear().Test__split("a . . . b" , "a", "b");} // EX: "Did you know . . ." + @Test public void Ellipsis__len_3() {fxt.Clear().Test__split("a... bc d" , "a", "...", "bc", "d");} // EX: "Nights into Dreams..." + @Test public void Ellipsis__len_3__bgn() {fxt.Clear().Test__split("a ...b" , "a", "...", "b"); ;} // NOTE: make sure "dot_bgn" code doesn't break this + @Test public void Ellipsis__len_2() {fxt.Clear().Test__split("a.. b" , "a", "..", "b");} // EX: "3.. 6.. 9 Seconds of Light" + @Test public void Ellipsis__bgn() {fxt.Clear().Test__split("...a" , "...", "a");} + @Test public void Ellipsis__end() {fxt.Clear().Test__split("a..." , "a", "...");} + @Test public void Ellipsis__no_ws() {fxt.Clear().Test__split("a...b" , "a", "...", "b");} + @Test public void Ellipsis__term() {fxt.Clear().Test__split("a...?!" , "a", "...");} // EX: "Wetten, dass..?" + @Test public void Apos__merge__end__eos() {fxt.Clear().Test__split("ab's" , "ab's", "abs");} // EX: "A Midsummer Night's Dream"; "Director's cut" + @Test public void Apos__merge__end__word() {fxt.Clear().Test__split("ab's c" , "ab's", "abs", "c");} // EX: "Director's cut"; "Cap'n Crunch"; + @Test public void Apos__merge__bgn() {fxt.Clear().Test__split("a o'bc" , "a", "o'bc", "obc");} // EX: "Twelve O'Clock High"; "Shaqille O'Neal"; "Banca d'Italia" + @Test public void Apos__merge__mid() {fxt.Clear().Test__split("i'm" , "i'm", "im");} + @Test public void Apos__bgn__long() {fxt.Clear().Test__split("a 'tis b" , "a", "'tis", "tis", "b");} // EX: "My Country, 'Tis of Thee"; "Omaha hold 'em"; "Slash'EM"; "Expo '92" + @Test public void Apos__end__eos() {fxt.Clear().Test__split("a'" , "a");} + @Test public void Apos__end__short() {fxt.Clear().Test__split("a' b" , "a", "b");} // EX: "Will-o'-the-wisp"; "Portuguese man o' war"; + @Test public void Apos__end__long() {fxt.Clear().Test__split("ab' c" , "ab", "c");} // EX: "Dunkin' Donuts"; "'Allo 'Allo!"; "Catherine de' Medici" + @Test public void Apos__both__n() {fxt.Clear().Test__split("a 'n' b" , "a", "'n'", "n", "b");} // EX: "Rock 'n' Roll"; "Town 'n' Country, Florida"; "Hill 'n Dale, Florida"; "Chip 'n Dale Rescue Rangers" + @Test public void Apos__multiple() {fxt.Clear().Test__split("ab''cd" , "ab''cd");} + @Test public void Apos__lone() {fxt.Clear().Test__split("' a" , "'", "a");} // EX: "' (disambiguation)" + @Test public void Dash__one() {fxt.Clear().Test__split("a-b" , "a", "b", "a-b");} // EX: "The Amazing Spider-Man"; "On-super percentage"; "Basic Role-Playing"; "Context-sensitive"; "Cross-country skiing"; "Double-barreled shotgun"; "Dot-com bubble"; "Many-worlds interpretation"; "Faster-than-light"; "Gram-positive bacteria"; "Half-life", "Jean-Paul Sartre"; "Austria-Hungary" + @Test public void Dash__many() {fxt.Clear().Test__split("a-b-c" , "a", "b", "c", "a-b-c");} + @Test public void Dash__ws() {fxt.Clear().Test__split("a - b" , "a", "-", "b");} + @Test public void Dash__eos() {fxt.Clear().Test__split("a-" , "a", "a-");} + @Test public void Dash__bos() {fxt.Clear().Test__split("-a" , "a", "-a");} + @Test public void Dash__mult__2() {fxt.Clear().Test__split("--" , "--");} + @Test public void Dash__mult__3() {fxt.Clear().Test__split("---" , "---");} + @Test public void Dash__mult__2__words() {fxt.Clear().Test__split("a--b" , "a", "b", "a--b");} + @Test public void Dash__w_comma() {fxt.Clear().Test__split("a-, b" , "a", "a-", "b");} + @Test public void Slash__one() {fxt.Clear().Test__split("a/b" , "a", "b");} // EX: "Good cop/bad cop"; "Snooker world rankings 2004/2005"; "Debian GNU/Hurd"; "HIV/AIDS in the United States"; "List of minor planets/1�100" + @Test public void Slash__many() {fxt.Clear().Test__split("a/b/c" , "a", "b", "c");} // EX: "Age/sex/location"; + @Test public void Slash__ws() {fxt.Clear().Test__split("a / b" , "a", "b");} + @Test public void Dash__slash() {fxt.Clear().Test__split("a-b/c-d-e/f-g" , "a", "b", "a-b", "c", "d", "e", "c-d-e", "f", "g", "f-g");} + @Test public void Paren__both__one() {fxt.Clear().Test__split("a (b) c" , "a", "b", "c");} // EX: "A (letter)" + @Test public void Paren__both__many() {fxt.Clear().Test__split("a (b c) d" , "a", "b", "c", "d");} // EX: "A (2016 film)" + @Test public void Paren__bgn__multiple() {fxt.Clear().Test__split("a (((b)))" , "a", "b");} + @Test public void Paren__unmatched() {fxt.Clear().Test__split("a(b" , "a(b");} + @Test public void Paren__unmatched__bgn() {fxt.Clear().Test__split("a (b" , "a", "b");} + @Test public void Paren__mid() {fxt.Clear().Test__split("a(b)c" , "a(b)c");} // EX: "Chloro(pyridine)cobaloxime"; "Exi(s)t" + @Test public void Paren__end() {fxt.Clear().Test__split("a(b)" , "a(b)", "a");} // EX: "Come What(ever) May"; "501(c) organization"; "Reindeer(s) Are Better Than People"; "(Miss)understood"; "Chromium(III) picolinate" + @Test public void Paren__bgn() {fxt.Clear().Test__split("(a)b" , "(a)b", "b");} // EX: "International Student Congress of (bio)Medical Sciences" + @Test public void Paren__end__dash() {fxt.Clear().Test__split("a(b-c) d" , "a(b-c)", "a", "d");} // EX: "Bis(2-ethylhexyl) phthalate" + @Test public void Paren__end__comma() {fxt.Clear().Test__split("a(b,c) d" , "a(b,c)", "a", "d");} // EX: "Iron(II,III) oxide" + @Test public void Paren__comma() {fxt.Clear().Test__split("a (b), c" , "a", "b", "c");} // EX: "Corning (city), New York" + @Test public void Paren__multiple() {fxt.Clear().Test__split("(a) (b)" , "a", "b");} + @Test public void Quote__both() {fxt.Clear().Test__split("a \"b\" c" , "a", "b", "c");} + @Test public void Word_bgn__at() {fxt.Clear().Test__split("@a" , "@a", "a");} + @Test public void Word_bgn__tilde() {fxt.Clear().Test__split("~a~" , "a");} // EX: "Phantom ~Requiem for the Phantom~" +} +class Srch_text_parser_fxt { + private final Srch_text_parser word_parser = new Srch_text_parser(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); + private Xol_case_mgr case_mgr; + public void Init() { + case_mgr = Xol_case_mgr_.A7(); + word_parser.Init_for_ttl(case_mgr); + } + public Srch_text_parser_fxt Clear() { + word_parser.word_hash.Clear(); + return this; + } + public Srch_word_itm Make_word(String raw, int count) {return new Srch_word_itm(Bry_.new_u8(raw)).Count_(count);} + public void Test__split(String src, String... expd_words) { + int len = expd_words.length; + Srch_word_itm[] ary = new Srch_word_itm[len]; + for (int i = 0; i < len; ++i) { + ary[i] = Make_word(expd_words[i], 1); + } + Test__split(src, ary); + } + public void Test__split(String src, Srch_word_itm... expd_words) { + byte[] src_bry = Bry_.new_u8(src); + word_parser.Parse(Bool_.Y, src_bry, 0, src_bry.length); + Tfds.Eq_str_lines(To_str(expd_words), To_str(word_parser.word_hash)); + } + private String To_str(Srch_word_itm[] word_ary) { + int len = word_ary.length; + for (int i = 0; i < len; ++i) { + if (i != 0) tmp_bfr.Add_byte_nl(); + Srch_word_itm word = word_ary[i]; + tmp_bfr.Add(word.Word).Add_byte_pipe(); + tmp_bfr.Add_int_variable(word.Count()); + } + return tmp_bfr.To_str_and_clear(); + } + private String To_str(Srch_word_hash word_mgr) { + int len = word_mgr.Len(); + Srch_word_itm[] ary = new Srch_word_itm[len]; + for (int i = 0; i < len; ++i) + ary[i] = word_mgr.Get_at(i); + return To_str(ary); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_wkr.java new file mode 100644 index 000000000..64643dacb --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_text_parser_wkr.java @@ -0,0 +1,25 @@ +/* +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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +public interface Srch_text_parser_wkr { + void Parse_done(Srch_word_itm word); +} +class Srch_text_parser_wkr__noop implements Srch_text_parser_wkr { + public void Parse_done(Srch_word_itm word) {} + public static final Srch_text_parser_wkr__noop Instance = new Srch_text_parser_wkr__noop(); Srch_text_parser_wkr__noop() {} +} diff --git a/100_core/src/gplx/KeyValHash_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_hash.java similarity index 52% rename from 100_core/src/gplx/KeyValHash_tst.java rename to 400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_hash.java index 37e37fa52..c1340dcdf 100644 --- a/100_core/src/gplx/KeyValHash_tst.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_hash.java @@ -15,22 +15,19 @@ 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 KeyValHash_tst { - @Test public void AryVals() { - tst_AryVals(ary_()); - tst_AryVals(ary_("key1", "1"), kv_("key1", "1")); - tst_AryVals(ary_("key1", "1", "key2", "2"), kv_("key1", "1"), kv_("key2", "2")); - } - @Test public void Fail_lengthMustBeEven() { - try { - tst_AryVals(ary_("key1"), kv_("key1", "1")); - Tfds.Fail_expdError(); +package gplx.xowa.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +public class Srch_word_hash { + private final Ordered_hash hash = Ordered_hash_.New_bry(); + public void Clear() {hash.Clear();} + public int Len() {return hash.Count();} + public boolean Has(byte[] word) {return hash.Has(word);} + public Srch_word_itm Get_at(int i) {return (Srch_word_itm)hash.Get_at(i);} + public void Add(byte[] word) { + Srch_word_itm itm = (Srch_word_itm)hash.Get_by(word); + if (itm == null) { + itm = new Srch_word_itm(word); + hash.Add(word, itm); } - catch (Exception e) {Err_.Noop(e);} + itm.Count_add_1_(); } - void tst_AryVals(String[] ary, KeyVal... expd) {Tfds.Eq_ary_str(expd, KeyValHash.strAry_(ary).Xto_bry());} - KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);} - String[] ary_(String... ary) {return ary;} } diff --git a/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_itm.java b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_itm.java new file mode 100644 index 000000000..978710093 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/parsers/Srch_word_itm.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.addons.searchs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +public class Srch_word_itm { + public Srch_word_itm(byte[] word) { + this.Word = word; + this.count = 0; + } + public final byte[] Word; + public int Count() {return count;} private int count; + public void Count_add_1_() {++count;} + @gplx.Internal protected Srch_word_itm Count_(int v) {this.count = v; return this;} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_ns_mgr.java similarity index 50% rename from 400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java rename to 400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_ns_mgr.java index 474f91341..5913c2545 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_ns_mgr.java @@ -15,25 +15,27 @@ 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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +package gplx.xowa.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.core.primitives.*; import gplx.xowa.wikis.nss.*; -public class Xows_ns_mgr { - private final Ordered_hash ns_hash = Ordered_hash_.New(); private final Int_obj_ref tmp_ns_id = Int_obj_ref.neg1_(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(32); +public class Srch_ns_mgr { + private final Ordered_hash ns_hash = Ordered_hash_.New(); private final Int_obj_ref tmp_ns_id = Int_obj_ref.neg1_(); + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(32); private boolean ns_all, ns_main; public void Clear() { ns_hash.Clear(); ns_all = ns_main = false; } + public boolean Ns_main_only() {return ns_main;} public boolean Has(int ns_id) { - return ns_all // all flag set - || ns_main && ns_id == Xow_ns_.Tid__main // main flag set - || ns_hash.Has(tmp_ns_id.Val_(ns_id)) // check against ns_hash - ; + return ns_all // ns_all always returns true + || ns_main && ns_id == Xow_ns_.Tid__main // ns_main returns true if main_ns + || ns_hash.Has(tmp_ns_id.Val_(ns_id)); // ns_hash returns true if has ns_id } - public void Add_by_id(int ns_id) { - if (ns_hash.Has(tmp_ns_id.Val_(ns_id))) - ns_hash.Del(tmp_ns_id); + public void Add_all() {ns_all = true;} + public Srch_ns_mgr Add_main_if_empty() {if (ns_hash.Count() == 0) ns_main = true; return this;} + public void Add_by_id(int ns_id) { + if (ns_hash.Has(tmp_ns_id.Val_(ns_id))) ns_hash.Del(tmp_ns_id); ns_hash.Add_as_key_and_val(Int_obj_ref.new_(ns_id)); } public void Add_by_name(byte[] ns_name) { @@ -41,14 +43,11 @@ public class Xows_ns_mgr { if (id != Xow_ns_.Tid__null) Add_by_id(id); } - public void Add_all() { - ns_all = true; - } public void Add_by_parse(byte[] key, byte[] 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 + if (key_len == 3 && key[2] == Srch_search_addon.Wildcard__star) // key=ns* sets ns_all to true ns_all = true; else { int ns_id = Bry_.To_int_or(key, 2, key_len, Int_.Min_value); @@ -59,15 +58,9 @@ public class Xows_ns_mgr { } } } - public void Add_main_if_empty() { - if (ns_hash.Count() == 0) - ns_main = true; - } public byte[] To_hash_key() { - if (ns_all) - return Hash_key_all; - else if (ns_main) - return Hash_key_main; + if (ns_all) return Hash_key_all; + else if (ns_main) return Hash_key_main; else { int ns_hash_len = ns_hash.Count(); for (int i = 0; i < ns_hash_len; i++) { @@ -78,5 +71,29 @@ public class Xows_ns_mgr { return tmp_bfr.To_bry_and_clear(); } } - private static final byte[] Hash_key_all = new byte[] {Byte_ascii.Star}, Hash_key_main = new byte[] {Byte_ascii.Num_0}; + public void Add_by_int_ids(int[] ns_ids) { + this.Clear(); + if (ns_ids.length == 0) { + this.Add_all(); + } else if (ns_ids.length == 1 && ns_ids[0] == Xow_ns_.Tid__main) { + this.Add_main_if_empty(); + } else { + for (int ns_id : ns_ids) + this.Add_by_id(ns_id); + } + } + public int[] To_int_ary() { + if (ns_all) return Int_.Ary_empty; + else if (ns_main) return Int_.Ary(Xow_ns_.Tid__main); + else { + int len = ns_hash.Count(); + int[] rv = new int[len]; + for (int i = 0; i < len; i++) { + Int_obj_ref ns_id_ref = (Int_obj_ref)ns_hash.Get_at(i); + rv[i] = ns_id_ref.Val(); + } + return rv; + } + } + private static final byte[] Hash_key_all = new byte[] {Srch_search_addon.Wildcard__star}, Hash_key_main = new byte[] {Byte_ascii.Num_0}; } diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_cmd.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_cmd.java new file mode 100644 index 000000000..6910b53dd --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_cmd.java @@ -0,0 +1,55 @@ +/* +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.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; +import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_search_cmd implements Cancelable, GfoInvkAble { + private final Srch_search_mgr search_mgr; + public final Srch_search_qry qry; + public final Srch_crt_mgr crt_mgr; + private final Srch_rslt_cbk rslt_cbk; + private final Srch_rslt_list rslts_list; + public Srch_search_cmd(Srch_search_mgr search_mgr, Srch_search_qry qry, Srch_crt_mgr crt_mgr, Srch_rslt_cbk rslt_cbk, Srch_rslt_list rslts_list) { + this.search_mgr = search_mgr; this.qry = qry; this.crt_mgr = crt_mgr; this.rslt_cbk = rslt_cbk; this.rslts_list = rslts_list; + } + public boolean Canceled() {return canceled;} private boolean canceled; + public void Cancel() { + canceled = true; + rslt_cbk.On_cancel(); + } + private void Search() { + try { + search_mgr.Search_async(this, qry, crt_mgr, rslt_cbk, rslts_list); // NOTE: must handle any errors in async mode + } + catch(Exception e) { + Xoa_app_.Usr_dlg().Prog_many("", "", "error during search: err=~{0}", Err_.Message_gplx_log(e)); + } + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__search)) Search(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + public static final String Invk__search = "search"; + public static Srch_search_cmd Noop() { + if (noop == null) { + noop = new Srch_search_cmd(null, null, null, Srch_rslt_cbk_.Noop, null); + } + return noop; + } private static Srch_search_cmd noop; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_ctx.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_ctx.java new file mode 100644 index 000000000..2ed60c5a5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_ctx.java @@ -0,0 +1,69 @@ +/* +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.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.langs.cases.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.searchs.dbs.*; +import gplx.xowa.addons.searchs.searchers.crts.*; import gplx.xowa.addons.searchs.searchers.rslts.*; import gplx.dbs.percentiles.*; import gplx.xowa.addons.searchs.searchers.wkrs.*; +import gplx.xowa.addons.searchs.parsers.*; +public class Srch_search_ctx { + public Srch_search_ctx(Cancelable cxl, Xow_wiki wiki, Srch_search_addon addon + , Srch_rslt_list cache__page, Hash_adp_bry cache__word_counts + , Srch_search_qry qry, Srch_crt_scanner_syms scanner_syms, Srch_crt_mgr crt_mgr, Srch_rslt_list rslts_list) { + this.Cxl = cxl; + this.Wiki = wiki; + this.Wiki_domain = wiki.Domain_bry(); + this.Case_mgr = wiki.Case_mgr(); + this.Addon = addon; + this.Cache__page = cache__page; + this.Cache__word_counts = cache__word_counts; + this.Qry = qry; + this.Scanner_syms = scanner_syms; + this.Crt_mgr = crt_mgr; + this.Crt_mgr__root = crt_mgr.Root; + this.Rslts_list = rslts_list; + this.Db__core = wiki.Data__core_mgr().Db__core(); + this.Tbl__page = Db__core.Tbl__page(); + this.Tbl__word = addon.Db_mgr().Tbl__word(); + this.Tbl__link__ary = addon.Db_mgr().Tbl__link__ary(); + long page_count = wiki.Stats().Num_pages(); + this.Score_rng.Init(page_count, addon.Db_mgr().Cfg().Link_score_max()); + int rslts_needed = qry.Slab_end - rslts_list.Len(); + if (rslts_needed < 0) rslts_needed = 0; + this.Rslts_needed = rslts_needed; + this.Highlight_mgr = new Srch_highlight_mgr(this.Case_mgr).Search_(qry.Phrase.Orig); + } + public final Cancelable Cxl; + public final Xow_wiki Wiki; + public final byte[] Wiki_domain; + public final Srch_search_addon Addon; + public final Xol_case_mgr Case_mgr; + public final Srch_rslt_list Cache__page; + public final Hash_adp_bry Cache__word_counts; + public final Xowd_db_file Db__core; + public final Xowd_page_tbl Tbl__page; + public final Srch_word_tbl Tbl__word; + public final Srch_link_tbl[] Tbl__link__ary; + public final Srch_search_qry Qry; + public final Srch_crt_scanner_syms Scanner_syms; + public final Srch_rslt_list Rslts_list; + public final int Rslts_needed; + public final Percentile_rng Score_rng = new Percentile_rng(); + public final Srch_crt_mgr Crt_mgr; + public final Srch_crt_itm Crt_mgr__root; + public final Srch_highlight_mgr Highlight_mgr; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_mgr.java new file mode 100644 index 000000000..67710c652 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_mgr.java @@ -0,0 +1,85 @@ +/* +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.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; import gplx.xowa.addons.searchs.searchers.wkrs.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.crts.*; +import gplx.xowa.addons.searchs.searchers.crts.visitors.*; +public class Srch_search_mgr { + private final Srch_search_addon addon; + private final Xow_wiki wiki; + private final Srch_rslt_list cache__page = new Srch_rslt_list(); + private final Hash_adp_bry cache__word_counts = Hash_adp_bry.cs(); + private final Srch_rslt_cache cache__rslts = new Srch_rslt_cache(); + private final Srch_page_tbl_wkr page_tbl_searcher = new Srch_page_tbl_wkr(); + private final Srch_crt_parser crt_parser; + private final Srch_search_cmd[] cur_cmds; + private final Object mutex = new Object(); + private int search_count; + public Srch_search_mgr(Srch_search_addon addon, Xow_wiki wiki, Srch_text_parser parser) { + this.addon = addon; this.wiki = wiki; + crt_parser = new Srch_crt_parser(Scanner_syms); + + // init cur_cmds with Noop cmd to make cancel logic below easier + int len = Srch_search_qry.Tid_len; + this.cur_cmds = new Srch_search_cmd[Srch_search_qry.Tid_len]; + for (int i = 0; i < len; ++i) + cur_cmds[i] = Srch_search_cmd.Noop(); + } + public void Clear_rslts_cache() {cache__rslts.Clear();} + public void Search_cancel() { + cur_cmds[Srch_search_qry.Tid__suggest_box].Cancel(); + } + public void Search(Srch_search_qry qry, Srch_rslt_cbk cbk) { + if (qry.Phrase.Orig.length == 0) return; + + // handle obsolete search dbs; + if (addon.Db_mgr().Cfg().Version_id__needs_upgrade()) { + addon.Db_mgr().Upgrade_mgr.Upgrade(); + return; + } + + // cancel existing cmd + Srch_search_cmd cur_cmd = cur_cmds[qry.Tid]; + cur_cmd.Cancel(); + + // create new one; run it; + Srch_crt_mgr crt_mgr = crt_parser.Parse_or_invalid(qry.Phrase.Compiled, qry.Phrase.Wildcard); + if (crt_mgr == Srch_crt_mgr.Invalid) return; // handle "\\" which is invalid or other fatal errors + Srch_rslt_list rslts_list = cache__rslts.Get_or_new(crt_mgr.Key); + cur_cmd = new Srch_search_cmd(this, qry, crt_mgr, cbk, rslts_list); + cur_cmds[qry.Tid] = cur_cmd; + gplx.core.threads.Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_suggest, cur_cmd, Srch_search_cmd.Invk__search).Start(); + } + public void Search_async(Cancelable cxl, Srch_search_qry qry, Srch_crt_mgr crt_mgr, Srch_rslt_cbk rslt_cbk, Srch_rslt_list rslts_list) { + synchronized (mutex) { // force only one search at a time; do not (a) place around Thread_sleep; (b) reuse for any other locks + if (++search_count > 64) this.Clear(); // lazy way of clearing memory + Srch_search_ctx ctx = new Srch_search_ctx(cxl, wiki, addon, cache__page, cache__word_counts, qry, Scanner_syms, crt_mgr, rslts_list); + ctx.Score_rng.Select_init(ctx.Rslts_needed, rslts_list.Score_bgn, rslts_list.Score_len, Srch_link_wkr.Percentile_rng__calc_adj(crt_mgr.Words_nth__len())); + page_tbl_searcher.Search(ctx, rslt_cbk); + if (cxl.Canceled()) return; + Srch_link_wkr link_wkr = new Srch_link_wkr(); + link_wkr.Search(rslts_list, rslt_cbk, ctx); + } + } + private void Clear() { + search_count = 0; + cache__page.Clear(); + cache__word_counts.Clear(); + cache__rslts.Clear(); + } + public static final Srch_crt_scanner_syms Scanner_syms = Srch_crt_scanner_syms.Dflt; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase.java new file mode 100644 index 000000000..b2a95ebcb --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase.java @@ -0,0 +1,133 @@ +/* +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.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.btries.*; +import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_search_phrase { + public Srch_search_phrase(boolean wildcard, byte[] orig, byte[] compiled) { + this.Orig = orig; + this.Compiled = compiled; + this.Wildcard = wildcard; + } + public final boolean Wildcard; + public final byte[] Orig; // EX: "Earth" + public final byte[] Compiled; // EX: "earth*" + + public static Srch_search_phrase New(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, byte[] orig, boolean wildcard) { + int orig_len = orig.length; + if ( orig_len > 0 // if "*" at end, remove and change to wildcard; needed for Special:Search which will send in "earth*" but "earth" needed for highlighting + && orig[orig_len - 1] == Srch_crt_scanner_syms.Dflt.Wild()) { + orig = Bry_.Mid(orig, 0, orig_len - 1); + wildcard = true; + } + byte[] lcase = case_mgr.Case_build_lower(orig); + lcase = Auto_wildcard(lcase, Srch_crt_scanner_syms.Dflt); + return new Srch_search_phrase(wildcard, orig, lcase); + } + public static byte[] Auto_wildcard(byte[] raw, Srch_crt_scanner_syms syms) { + Btrie_slim_mgr trie = syms.Trie(); + int raw_len = raw.length; + int insert_pos = -1; + int fail_pos = -1; + for (int i = raw_len - 1; i > -1; --i) { + byte b = raw[i]; + byte tid = trie.Match_byte_or(b, raw, i, i + 1, Byte_.Max_value_127); + if (tid == Byte_.Max_value_127) { // unknown sym + if (b == syms.Wild()) { // wildcard is not tokenized + fail_pos = i; + break; + } + else { // alphanum-char + insert_pos = i; + break; + } + } + else { + switch (tid) { + case Srch_crt_tkn.Tid__quote: + case Srch_crt_tkn.Tid__space: + case Srch_crt_tkn.Tid__not: + case Srch_crt_tkn.Tid__and: + case Srch_crt_tkn.Tid__or: + case Srch_crt_tkn.Tid__paren_bgn: + fail_pos = i; // these symbols will not auto-wildcard, unless they are escaped + i = -1; + break; + case Srch_crt_tkn.Tid__escape: + if (i > 0) { + int prv_pos = i -1; + if (raw[prv_pos] == syms.Escape()) { // an escaped escape can be wildcarded; EX: "\\" -> "\\*" + insert_pos = i; + i = -1; + } + else + fail_pos = i; + } + else + fail_pos = i; + i = -1; + break; + case Srch_crt_tkn.Tid__paren_end: + break; + } + } + } + + // check if preceded by escape + if (insert_pos == -1) { + if ( fail_pos > 0 + && raw[fail_pos - 1] == syms.Escape()) { + insert_pos = fail_pos; + } + else + return raw; + } + + // check if word already has wildcard; EX: "a*b" x> "a*b*" + for (int i = insert_pos - 1; i > -1; --i) { + byte b = raw[i]; + if (b == syms.Wild()) { + int prv_pos = i - 1; + if (prv_pos > -1) { + if (raw[prv_pos] == syms.Escape()) { // ignore escaped wildcard + i = prv_pos; + continue; + } + } + return raw; // existing wildcard cancels auto-wildcard + } + else if (b == syms.Space()) { // stop looking when word ends + break; + } + else {} // alphanum; keep going + } + + // add wildcard + if (insert_pos == raw_len - 1) return Bry_.Add(raw, syms.Wild()); + else { + byte[] rv = new byte[raw_len + 1]; + int wildcard_pos = insert_pos + 1; + for (int i = 0; i < wildcard_pos; ++i) + rv[i] = raw[i]; + rv[wildcard_pos] = syms.Wild(); + for (int i = wildcard_pos; i < raw_len; ++i) + rv[i + 1] = raw[i]; + return rv; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase_tst.java new file mode 100644 index 000000000..20dd66aad --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_phrase_tst.java @@ -0,0 +1,46 @@ +/* +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.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import org.junit.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_search_phrase_tst { + private final Srch_search_phrase_fxt fxt = new Srch_search_phrase_fxt(); + @Test public void Word() {fxt.Test__auto_wildcard("a" , "a*");} + @Test public void Paren_end() {fxt.Test__auto_wildcard("(a)" , "(a*)");} + @Test public void Quoted() {fxt.Test__auto_wildcard("\"a\"" , "\"a\"");} + @Test public void Space() {fxt.Test__auto_wildcard(" " , " ");} + @Test public void Not() {fxt.Test__auto_wildcard("-" , "-");} + @Test public void And() {fxt.Test__auto_wildcard("+" , "+");} + @Test public void Or() {fxt.Test__auto_wildcard("," , ",");} + @Test public void Paren_bgn() {fxt.Test__auto_wildcard("(" , "(");} + @Test public void Star() {fxt.Test__auto_wildcard("*" , "*");} + @Test public void Wildcard__exists__y() {fxt.Test__auto_wildcard("a*b" , "a*b");} + @Test public void Wildcard__exists__escaped() {fxt.Test__auto_wildcard("a\\*b" , "a\\*b*");} + @Test public void Wildcard__exists__n() {fxt.Test__auto_wildcard("a* bc" , "a* bc*");} + @Test public void Escape() {fxt.Test__auto_wildcard("\\*" , "\\**");} + @Test public void Escape__incomplete() {fxt.Test__auto_wildcard("a\\" , "a\\");} + @Test public void Escape__escaped() {fxt.Test__auto_wildcard("a\\\\" , "a\\\\*");} +} +class Srch_search_phrase_fxt { + private final Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.Dflt; + public Srch_search_phrase_fxt() {} + public void Test__auto_wildcard(String src_str, String expd) { + byte[] src_raw = Bry_.new_u8(src_str); + byte[] actl = Srch_search_phrase.Auto_wildcard(src_raw, syms); + Tfds.Eq(expd, String_.new_u8(actl)); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_qry.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_qry.java new file mode 100644 index 000000000..2aab52d4e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/Srch_search_qry.java @@ -0,0 +1,50 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.wikis.domains.*; +public class Srch_search_qry { + public Srch_search_qry(byte tid, Srch_ns_mgr ns_mgr, Srch_search_phrase phrase, int slab_bgn, int slab_end) { + this.Tid = tid; + this.Ns_mgr = ns_mgr; + this.Phrase = phrase; + this.Slab_bgn = slab_bgn; + this.Slab_end = slab_end; + } + public final byte Tid; + public final Srch_ns_mgr Ns_mgr; + public final Srch_search_phrase Phrase; + public final int Slab_bgn; // EX: 0 + public final int Slab_end; // EX: 20 + + public static final byte Tid_len = 4, Tid__url_bar = 0, Tid__suggest_box = 1, Tid__search_page = 2, Tid__android = 3; + public static Srch_search_qry New__url_bar(Xow_wiki wiki, gplx.xowa.apps.apis.xowa.addons.searchs.Xoapi_url_bar cfg, byte[] search_orig) { + return new Srch_search_qry(Tid__url_bar, cfg.Ns_mgr(), Srch_search_phrase.New(wiki.Case_mgr(), search_orig, cfg.Auto_wildcard()), 0, cfg.Max_results()); + } + public static Srch_search_qry New__suggest_box(Xow_wiki wiki, Srch_search_cfg cfg, byte[] search_orig) { + return new Srch_search_qry(Tid__suggest_box, cfg.Ns_mgr(), Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), 0, cfg.Rslts_max()); + } + public static Srch_search_qry New__search_page(Xow_domain_itm[] domains, Xow_wiki wiki, Srch_search_cfg cfg, boolean simple_search, byte[] search_orig, int slab_idx, int slab_len) { + int slab_bgn = slab_idx * slab_len; + int slab_end = slab_bgn + slab_len; + boolean wildcard = simple_search; + return new Srch_search_qry(Tid__search_page, cfg.Ns_mgr(), Srch_search_phrase.New(wiki.Case_mgr(), search_orig, wildcard), slab_bgn, slab_end); + } + public static Srch_search_qry New__drd(Xow_wiki wiki, Srch_ns_mgr ns_mgr, byte[] search_orig, int slab_bgn, int slab_end) { + return new Srch_search_qry(Tid__android, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), slab_bgn, slab_end); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__suggest_box.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__suggest_box.java new file mode 100644 index 000000000..b69802f79 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__suggest_box.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.addons.searchs.searchers.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.core.js.*; +import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_rslt_cbk__suggest_box implements Srch_rslt_cbk, GfoInvkAble { + private final Js_wtr js_wtr = new Js_wtr(); + private final Xoae_app app; + private final byte[] cbk_func; + private final byte[] search_raw; + public Srch_rslt_cbk__suggest_box(Xoae_app app, byte[] cbk_func, byte[] search_raw) { + this.app = app; this.cbk_func = cbk_func; + this.search_raw = search_raw; + } + public void On_cancel() {} + public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + if (!rslts_list.Rslts_are_enough && !rslts_list.Rslts_are_done) return; + js_wtr.Func_init(cbk_func); + js_wtr.Prm_bry(search_raw); + js_wtr.Prm_spr(); + js_wtr.Ary_init(); + int rslts_len = rslts_list.Len(); + for (int i = 0; i < qry.Slab_end; i++) { + if (i >= rslts_len) break; // rslts_end will overshoot actual rslts_len; check for out of bounds and exit; EX: default suggest will have rslts_end of 25, but "earth time" will retrieve 15 results + Srch_rslt_row row = rslts_list.Get_at(i); + js_wtr.Ary_bry(row.Page_ttl.Full_txt_w_ttl_case()); + js_wtr.Ary_bry(row.Page_ttl_display(Bool_.Y)); + } + js_wtr.Ary_term(); + js_wtr.Func_term(); + GfoInvkAble_.InvkCmd(app.Gui_mgr().Kit().New_cmd_sync(this), Srch_rslt_cbk__suggest_box.Invk__notify); + } + private void Notify() { + app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_script(js_wtr.To_str_and_clear()); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__notify)) Notify(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + public static final String Invk__notify = "notify"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java new file mode 100644 index 000000000..5695c4230 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java @@ -0,0 +1,86 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.searchers.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.gfui.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; +import gplx.xowa.apps.apis.xowa.addons.searchs.*; +public class Srch_rslt_cbk__url_bar implements Srch_rslt_cbk, GfoInvkAble { + private final Xoae_app app; + private final GfuiComboBox url_bar; + private final Xoapi_url_bar url_bar_api; + private String[] cbo_ary; + private boolean rslts_finished; + private int rslts_in_this_pass; + private boolean rslts_shown = false; + public Srch_rslt_cbk__url_bar(Xoae_app app, GfuiComboBox url_bar, Xoapi_url_bar url_bar_api) { + this.app = app; this.url_bar = url_bar; this.url_bar_api = url_bar_api; + } + public void On_cancel() {} + public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + int rslts_len = rslts_list.Len(); + this.rslts_finished = rslts_list.Rslts_are_enough || rslts_list.Rslts_are_done; + + // get # of items for drop-down; note special logic to reduce blinking + rslts_in_this_pass = rslts_end - rslts_bgn; + if ( rslts_in_this_pass == 0 // no new results; + && rslts_bgn != 0 // if first one, still update; blanks out results from previous try; + && !rslts_finished) // if rslts_finished, still update to force cbo to "shrink" + return; // exit now else will "blink" when refreshing; + int max_rslts = url_bar_api.Max_results(); + int cbo_len = max_rslts; // force cbo_len to be max_rslts; reduces "blinking" when typing by keeping visible area to same size + if (rslts_list.Rslts_are_done) { // "shrink" cbo_len to rslts_len; EX: 10 wanted; 2 returned; shrink to 2 rows; + cbo_len = rslts_len; + } + + // fill cbo_ary with rslts from search, while "blanking" out rest + this.cbo_ary = new String[cbo_len]; + for (int i = 0; i < cbo_len; ++i) { + String cbo_itm = ""; + if (i >= max_rslts) break; + if (i < rslts_len) { + Srch_rslt_row rslt = rslts_list.Get_at(i); + cbo_itm = String_.new_u8(rslt.Page_ttl_display(Bool_.N)); + } + cbo_ary[i] = cbo_itm; + } + + GfoInvkAble_.InvkCmd(app.Gui_mgr().Kit().New_cmd_sync(this), Srch_rslt_cbk__url_bar.Invk__items__update); // NOTE: needs to be sync, b/c page_wkr and link_wkr must execute in order; EX:"Portal:Science" does not show; DATE:2016-03-24 + } + private void Items__update() { + url_bar.Items__update(cbo_ary); + if (!url_bar.List_visible() // rslt_list not visible + && !rslts_shown // auto-dropdown hasn't happened yet + && (rslts_in_this_pass > 0 || rslts_finished) // at least 1 rslt, or search done + ) { + rslts_shown = true; // only auto-show dropdown once; allows user to close drop-down and not have it continually flashing + url_bar.List_visible_(Bool_.Y); + } + Xoa_app_.Usr_dlg().Prog_none("", "", ""); + if (rslts_finished) { + if (cbo_ary.length == 0) + url_bar.List_visible_(Bool_.N); + else + url_bar.Items__size_to_fit(cbo_ary.length); + } + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__items__update)) Items__update(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk__items__update = "items__update"; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_suggest_cmd__page_tbl.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_suggest_cmd__page_tbl.java new file mode 100644 index 000000000..316156700 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/cbks/Srch_suggest_cmd__page_tbl.java @@ -0,0 +1,51 @@ +/* +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 . +*/ +//namespace gplx.xowa.addons.searchs.searchers.cbks { +// class Srch_suggest_cmd__page_tbl { +// private boolean Search_by_all_pages_v2() { +// rslts_2.Clear(); +// Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_bry); if (search_ttl == null) return false; +// byte[] search_ttl_bry = search_ttl.Page_db(); +// wiki.Db_mgr().Load_mgr().Load_ttls_for_search_suggest(this, rslts_2, search_ttl.Ns(), search_ttl_bry, max_results, all_pages_min, all_pages_extend, true, false); +// return true; +// } +// private boolean Search_by_all_pages_v1() { +// rslts_2.Clear(); +// Xowd_page_itm rslt_nxt = new Xowd_page_itm(); +// Xowd_page_itm rslt_prv = new Xowd_page_itm(); +// Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_bry); if (search_ttl == null) return false; +// byte[] search_ttl_bry = search_ttl.Page_db(); +// List_adp page_list = List_adp_.new_(); +// wiki.Db_mgr().Load_mgr().Load_ttls_for_all_pages(this, page_list, rslt_nxt, rslt_prv, Int_obj_ref.zero_(), wiki.Ns_mgr().Ns_main(), search_ttl_bry, max_results, all_pages_min, all_pages_extend, true, false); +// Xowd_page_itm[] page_ary = (Xowd_page_itm[])page_list.To_ary_and_clear(typeof(Xowd_page_itm)); +// int idx = 0, page_ary_len = page_ary.length; +// for (int i = 0; i < page_ary_len; i++) { +// Xowd_page_itm page = page_ary[i]; +// if (page != null) { +// if (!Bry_.Has_at_bgn(page.Ttl_page_db(), search_ttl_bry)) continue; // look-ahead may return other titles that don't begin with search; ignore +// if (page.Text_len() > all_pages_min) { +// rslts_2.Add(page); +// idx++; +// } +// } +// if (idx == max_results) break; +// } +// return true; +// } +// } +//} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_itm.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_itm.java new file mode 100644 index 000000000..f8b0593fd --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_itm.java @@ -0,0 +1,48 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.langs.regxs.*; +public class Srch_crt_itm { + public Srch_crt_itm(int idx, int tid, Srch_crt_itm[] subs, byte[] raw, Srch_crt_sql raw_data) { + this.Idx = idx; this.Tid = tid; this.Subs = subs; + this.Raw = raw; + this.Sql_data = raw_data; + } + public final int Idx; // itm index; EX: "a b" -> a:0 b:1 + public final int Tid; + public final byte[] Raw; + public final Srch_crt_itm[] Subs; + public final Srch_crt_sql Sql_data; + public void Accept_visitor(Srch_crt_visitor visitor) {visitor.Visit(this);} + + public static final int + Tid__word = 0 // EX: 'A' + , Tid__and = 1 // EX: 'A B' + , Tid__or = 2 // EX: 'A OR B' + , Tid__not = 3 // EX: '-A' + , Tid__word_quote = 4 // EX: '"A B"' + , Tid__invalid = 5 // EX: 'A OR'; incomplete or otherwise invalid + ; + public static Srch_crt_itm[] Ary_empty = new Srch_crt_itm[0]; + public static final Srch_crt_itm Invalid = new Srch_crt_itm(-1, Srch_crt_itm.Tid__invalid, Srch_crt_itm.Ary_empty, null, null); + public static Srch_crt_itm New_join(int tid, int idx, Srch_crt_itm... ary) {return new Srch_crt_itm(idx, tid, ary, null, Srch_crt_sql.New_or_null(null, Byte_ascii.Null));} + public static Srch_crt_itm New_word(byte wildcard_byte, Srch_crt_tkn tkn, int idx, byte[] src) { + int tid = tkn.Tid == Srch_crt_tkn.Tid__word_w_quote ? Srch_crt_itm.Tid__word_quote : Srch_crt_itm.Tid__word; + return new Srch_crt_itm(idx, tid, Srch_crt_itm.Ary_empty, tkn.Val, Srch_crt_sql.New_or_null(src, wildcard_byte)); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_mgr.java new file mode 100644 index 000000000..3ba8200db --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_mgr.java @@ -0,0 +1,44 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_crt_mgr { + public Srch_crt_mgr(byte[] key, Srch_crt_tkn[] tkns, Srch_crt_itm root, byte words_tid, Srch_crt_itm[] words_ary, Srch_crt_itm words_nth) { + this.Key = key; + this.Tkns = tkns; + this.Root = root; + this.Words_tid = words_tid; + this.Words_ary = words_ary; + this.Words_nth = words_nth; + } + public final byte[] Key; + public final Srch_crt_tkn[] Tkns; + public final Srch_crt_itm Root; + public final byte Words_tid; + public final Srch_crt_itm[] Words_ary; + public final Srch_crt_itm Words_nth; + public int Words_nth__len() { + return Words_nth == null ? 0 : Words_nth.Raw.length; + } + + public static final byte + Tid__one = 0 + , Tid__ands = 1 + , Tid__mixed = 2 + ; + public static Srch_crt_mgr Invalid = new Srch_crt_mgr(Bry_.Empty, Srch_crt_tkn.Ary_empty, Srch_crt_itm.Invalid, Tid__one, Srch_crt_itm.Ary_empty, Srch_crt_itm.Invalid); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser.java new file mode 100644 index 000000000..cb7db43bc --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser.java @@ -0,0 +1,146 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.xowa.addons.searchs.searchers.crts.visitors.*; +public class Srch_crt_parser { + private final Srch_crt_scanner scanner; + private final Srch_crt_visitor__words words_visitor = new Srch_crt_visitor__words(); + private final Srch_crt_visitor__print print_visitor = new Srch_crt_visitor__print(); + private final byte wildcard_byte; + private int uid_next; + public Srch_crt_parser(Srch_crt_scanner_syms trie_bldr) { + this.wildcard_byte = trie_bldr.Wild(); + this.scanner = new Srch_crt_scanner(trie_bldr); + } + public int Next_uid() {return ++uid_next;} + public Srch_crt_mgr Parse_or_invalid(byte[] src, boolean auto_wildcard) { + this.uid_next = -1; + + Srch_crt_tkn[] tkns_ary = scanner.Scan(src); + Srch_crt_parser_frame root_frame = new Srch_crt_parser_frame(this); + Parse_tkns(root_frame, tkns_ary, 0, tkns_ary.length); + Srch_crt_itm root_itm = root_frame.Produce_or_null(); + + if (root_itm == null) return Srch_crt_mgr.Invalid; + byte[] key = print_visitor.Print(root_itm); + words_visitor.Gather(root_itm); + return new Srch_crt_mgr(key, tkns_ary, root_itm, words_visitor.Words_tid(), words_visitor.Words_ary(), words_visitor.Words_nth()); + } + private int Parse_tkns(Srch_crt_parser_frame frame, Srch_crt_tkn[] tkns_ary, int tkns_bgn, int tkns_end) { + int tkns_cur = tkns_bgn; + while (tkns_cur < tkns_end) { + Srch_crt_tkn cur_tkn = tkns_ary[tkns_cur]; + int new_tkns_cur = Process_tkn(frame, tkns_ary, tkns_cur, tkns_end, cur_tkn); + if (new_tkns_cur < 0) { + tkns_cur = -new_tkns_cur; + break; + } + else + tkns_cur = new_tkns_cur; + } + return tkns_cur; + } + private int Process_tkn(Srch_crt_parser_frame frame, Srch_crt_tkn[] tkns_ary, int tkns_cur, int tkns_end, Srch_crt_tkn cur_tkn) { + byte cur_tid = cur_tkn.Tid; + switch (cur_tid) { + case Srch_crt_tkn.Tid__word: + case Srch_crt_tkn.Tid__word_w_quote: + frame.Subs__add(Srch_crt_itm.New_word(wildcard_byte, cur_tkn, frame.Next_uid(), cur_tkn.Val)); + break; + case Srch_crt_tkn.Tid__and: + frame.Eval_join(Srch_crt_itm.Tid__and); + break; + case Srch_crt_tkn.Tid__or: + frame.Eval_join(Srch_crt_itm.Tid__or); + break; + case Srch_crt_tkn.Tid__paren_bgn: { + Srch_crt_parser_frame paren_frame = new Srch_crt_parser_frame(this); + int new_tkns_cur = Parse_tkns(paren_frame, tkns_ary, tkns_cur + 1, tkns_end); + Srch_crt_itm paren_itm = paren_frame.Produce_or_null(); + if (paren_itm != null) { + frame.Subs__add(paren_itm); + } + return new_tkns_cur; + } + case Srch_crt_tkn.Tid__paren_end: + return -(tkns_cur + 1); + case Srch_crt_tkn.Tid__not: + frame.Notted_y_(); + break; + } + return tkns_cur + 1; + } +} +class Srch_crt_parser_frame { + public Srch_crt_parser_frame(Srch_crt_parser parser) { + this.parser = parser; + } + private int join_tid = Srch_crt_tkn.Tid__null; + private boolean notted = false; + private final List_adp subs = List_adp_.new_(); + private final Srch_crt_parser parser; + public int Next_uid() {return parser.Next_uid();} + public void Notted_y_() { + if (notted) // already notted; disable; EX: "--a" + notted = false; + else + notted = true; + } + public void Subs__add(Srch_crt_itm itm) { + // if notted, wrap itm in not; EX: "-a"; "-(a & b)" + if (notted) { + itm = Srch_crt_itm.New_join(Srch_crt_itm.Tid__not, this.Next_uid(), itm); + notted = false; + } + subs.Add(itm); + + // auto-and behavior; EX: "a b" -> "a & b"; EX: "a (b | c)" -> "a & (b | c)" + if ( join_tid == Srch_crt_tkn.Tid__null // if currently null + && subs.Len() > 1 // but 2 items in list + ) + join_tid = Srch_crt_itm.Tid__and; // default to AND; EX: "a (b) c" + } + public void Eval_join(int tid) { + if (join_tid == Srch_crt_tkn.Tid__null) join_tid = tid; + else if (join_tid == tid) {} // tid is same; ignore; note that this handles dupes; EX: "a & & b" + else { // tid changed; EX: a & b | c + Merge_and_add(); + join_tid = tid; + } + } + public Srch_crt_itm Produce_or_null() { + int subs_len = subs.Len(); + switch (subs_len) { + case 0: + return null; + case 1: + join_tid = Srch_crt_tkn.Tid__null; + return (Srch_crt_itm)subs.Get_at(0); + default: + Srch_crt_itm[] subs_ary = (Srch_crt_itm[])subs.To_ary_and_clear(Srch_crt_itm.class); + Srch_crt_itm rv = Srch_crt_itm.New_join(join_tid, parser.Next_uid(), subs_ary); + join_tid = Srch_crt_tkn.Tid__null; + return rv; + } + } + private void Merge_and_add() { + int subs_len = subs.Len(); + if (subs_len > 1) + subs.Add(Produce_or_null()); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser_tst.java new file mode 100644 index 000000000..5631d399e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_parser_tst.java @@ -0,0 +1,68 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import org.junit.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.crts.visitors.*; +public class Srch_crt_parser_tst { + private final Srch_crt_parser_fxt fxt = new Srch_crt_parser_fxt(); + @Test public void Word__one() {fxt.Test__parse("a" , "a");} + @Test public void And__one() {fxt.Test__parse("a + b" , "(a AND b)");} + @Test public void And__many() {fxt.Test__parse("a + b + c" , "(a AND b AND c)");} + @Test public void And__dangling() {fxt.Test__parse("a +" , "a");} + @Test public void And__dupe() {fxt.Test__parse("a + + b" , "(a AND b)");} + @Test public void Quote() {fxt.Test__parse("\"a b\"" , "\"a b\"");} + @Test public void Auto__word() {fxt.Test__parse("a b" , "(a AND b)");} + @Test public void Auto__quote() {fxt.Test__parse("a \"b\"" , "(a AND \"b\")");} + @Test public void Auto__parens() {fxt.Test__parse("a (b , c)" , "(a AND (b OR c))");} + @Test public void Or__one() {fxt.Test__parse("a , b" , "(a OR b)");} + @Test public void Or__many() {fxt.Test__parse("a , b , c" , "(a OR b OR c)");} + @Test public void Mixed__3() {fxt.Test__parse("a + b , c" , "((a AND b) OR c)");} + @Test public void Mixed__5() {fxt.Test__parse("a + b , c + d , e" , "((((a AND b) OR c) AND d) OR e)");} + @Test public void Parens__basic() {fxt.Test__parse("a + (b , c)" , "(a AND (b OR c))");} + @Test public void Parens__nest() {fxt.Test__parse("a + (b , (c + d))" , "(a AND (b OR (c AND d)))");} + @Test public void Parens__mid() {fxt.Test__parse("a + (b , c) + d)" , "(a AND (b OR c) AND d)");} + @Test public void Parens__mixed() {fxt.Test__parse("a + (b , c) , d)" , "((a AND (b OR c)) OR d)");} + @Test public void Parens__dupe() {fxt.Test__parse("((a))" , "a");} + @Test public void Parens__dangling__lhs() {fxt.Test__parse("(a" , "a");} + @Test public void Parens__dangling__rhs() {fxt.Test__parse("a)" , "a");} + @Test public void Parens__empty__bos() {fxt.Test__parse("()" , "");} + @Test public void Parens__empty__mid() {fxt.Test__parse("a () b" , "(a AND b)");} + @Test public void Not__bos() {fxt.Test__parse("-abc" , "NOT abc");} + @Test public void Not__mid() {fxt.Test__parse("a -b" , "(a AND NOT b)");} + @Test public void Not__2() {fxt.Test__parse("a -b -c" , "(a AND NOT b AND NOT c)");} + @Test public void Not__dangling__eos() {fxt.Test__parse("a -" , "a");} + @Test public void Not__dangling__mid() {fxt.Test__parse("a -- b" , "(a AND b)");} // NOTE: scanner will remove spaces and convert to "a", "--", "b" + @Test public void Not__dupe__2() {fxt.Test__parse("a --b" , "(a AND b)");} + @Test public void Not__dupe__3() {fxt.Test__parse("a ---b" , "(a AND NOT b)");} + @Test public void Not__parens() {fxt.Test__parse("a -(b + c)" , "(a AND NOT (b AND c))");} + @Test public void Escape__eos() {fxt.Test__parse("\\" , "");} + @Test public void Escape__escaped() {fxt.Test__parse("\\\\*" , "\\*");} // '\\' -> '\*' +} +class Srch_crt_parser_fxt { + private final Srch_crt_parser crt_parser; + private final Srch_crt_visitor__print visitor__to_str = new Srch_crt_visitor__print(); + public Srch_crt_parser_fxt() { + crt_parser = new Srch_crt_parser(Srch_crt_scanner_syms.Dflt); + Srch_text_parser text_parser = new Srch_text_parser(); + text_parser.Init_for_ttl(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); + } + public void Test__parse(String src_str, String expd) { + byte[] src_bry = Bry_.new_a7(src_str); + Srch_crt_mgr crt_mgr = crt_parser.Parse_or_invalid(src_bry, Bool_.N); + Tfds.Eq(expd, String_.new_u8(visitor__to_str.Print(crt_mgr.Root))); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner.java new file mode 100644 index 000000000..f5a8d4f24 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner.java @@ -0,0 +1,136 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.core.btries.*; import gplx.xowa.langs.cases.*; +import gplx.xowa.addons.searchs.parsers.*; +class Srch_crt_scanner { + private final List_adp tkns = List_adp_.new_(); private byte[] src; private int src_len, pos, txt_bgn; + private final Srch_crt_scanner_syms trie_bldr; private final Btrie_slim_mgr trie; + private final Bry_bfr word_bfr = Bry_bfr.new_(); private boolean word_is_dirty; + public Srch_crt_scanner(Srch_crt_scanner_syms trie_bldr) { + this.trie_bldr = trie_bldr; + this.trie = trie_bldr.Trie(); + } + public Srch_crt_tkn[] Scan(byte[] src) { + this.src = src; this.src_len = src.length; + tkns.Clear(); pos = 0; txt_bgn = -1; + while (pos < src_len) { + byte cur_b = src[pos]; + byte cur_tid = trie.Match_byte_or(cur_b, src, pos, src_len, Byte_.Max_value_127); + if (cur_tid == Byte_.Max_value_127) { // text character + if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it + if (word_is_dirty) word_bfr.Add_byte(cur_b); + ++pos; + } + else { // \ \s " - & | ( ) + int pos_end = trie.Match_pos(); + if ( cur_tid == Srch_crt_tkn.Tid__not // if "-" + && txt_bgn != -1) { // && "word has started" + ++pos; + continue; // ignore; EX: "a-b" -> "a-b"; "-ab" -> "NOT" "ab" + } + if ( txt_bgn != -1 // pending word + && cur_tid != Srch_crt_tkn.Tid__escape // not escape + ) { + Add_word(Srch_crt_tkn.Tid__word, txt_bgn, pos); + } + switch (cur_tid) { + case Srch_crt_tkn.Tid__escape: // handle escape + int nxt_pos = pos + 1; + if (txt_bgn == -1) { + txt_bgn = nxt_pos; + word_is_dirty = true; + } else { // word has started; transfer existing word to bfr; + if (!word_is_dirty) { + word_is_dirty = true; + word_bfr.Add_mid(src, txt_bgn, pos); + } + } + pos = nxt_pos; // skip "\" + if (pos < src_len) { + word_bfr.Add_byte(src[pos]); // add next char literally + ++pos; + } + break; + case Srch_crt_tkn.Tid__space: // discard spaces + pos = Bry_find_.Find_fwd_while(src, pos, src_len, trie_bldr.Space()); + break; + case Srch_crt_tkn.Tid__quote: // find end quote and add as word + int quote_bgn = pos + 1; + int quote_end = Int_.Min_value; + int tmp_pos = quote_bgn; + while (true) { + quote_end = Bry_find_.Find_fwd(src, trie_bldr.Quote(), tmp_pos, src_len); + if (quote_end == Bry_find_.Not_found) { // no end-quote found; use space + quote_end = Bry_find_.Find_fwd(src, trie_bldr.Space(), quote_bgn, src_len); + if (quote_end == Bry_find_.Not_found) quote_end = src_len; // no space found; use EOS + } + else { // end-quote found; check if it's doubled + int double_pos = quote_end + 1; + if ( double_pos < src_len + && src[double_pos] == Byte_ascii.Quote) { + if (!word_is_dirty) { + word_is_dirty = true; + } + word_bfr.Add_mid(src, tmp_pos, double_pos); + tmp_pos = double_pos + 1; + continue; + } + } + break; + } + if (word_is_dirty) + word_bfr.Add_mid(src, tmp_pos, quote_end); + Add_word(Srch_crt_tkn.Tid__word_w_quote, quote_bgn, quote_end); + pos = quote_end + 1; // +1 to place after quote + break; + case Srch_crt_tkn.Tid__not: + Add_word(Srch_crt_tkn.Tid__not, pos, pos_end); + pos = pos_end; + break; + case Srch_crt_tkn.Tid__paren_bgn: case Srch_crt_tkn.Tid__paren_end: + case Srch_crt_tkn.Tid__and: case Srch_crt_tkn.Tid__or: + tkns.Add(New_tkn(cur_tid, Bry_.Mid(src, pos, pos_end))); + pos = pos_end; + break; + default: throw Err_.new_unhandled_default(cur_tid); + } + } + } + if (txt_bgn != -1) { // pending word; create + Add_word(Srch_crt_tkn.Tid__word, txt_bgn, pos); + } + return (Srch_crt_tkn[])tkns.To_ary_and_clear(Srch_crt_tkn.class); + } + private void Add_word(byte tid, int src_bgn, int src_end) { + // generate word_bry + byte[] word_bry = null; + if (word_is_dirty) { + word_is_dirty = false; + if (word_bfr.Len_eq_0()) return; + word_bry = word_bfr.To_bry_and_clear(); + } + else { + if (src_end - src_bgn == 0) return; + word_bry = Bry_.Mid(src, src_bgn, src_end); + } + tkns.Add(New_tkn(tid, word_bry)); + txt_bgn = -1; + } + private static Srch_crt_tkn New_tkn(byte tid, byte[] val) {return new Srch_crt_tkn(tid, val);} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_syms.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_syms.java new file mode 100644 index 000000000..735f09838 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_syms.java @@ -0,0 +1,112 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.core.btries.*; +public class Srch_crt_scanner_syms { + public Srch_crt_scanner_syms(byte escape, byte space, byte quote, byte not, byte and, byte or, byte paren_bgn, byte paren_end, byte wild) { + this.escape = escape; this.space = space; this.quote = quote; + this.not = not; this.and = and; this.and_bry = Bry_.New_by_byte(and); this.or = or; + this.paren_bgn = paren_bgn; this.paren_end = paren_end; + this.wild = wild; + this.trie = Btrie_slim_mgr.cs(); + Make_trie(trie, this); + } + public byte Escape() {return escape;} private byte escape; + public byte Space() {return space;} private byte space; + public byte Quote() {return quote;} private byte quote; + public byte Not() {return not;} private byte not; + public byte And() {return and;} private byte and; + public byte[] And_bry() {return and_bry;} private byte[] and_bry; + public byte Or() {return or;} private byte or; + public byte Paren_bgn() {return paren_bgn;} private byte paren_bgn; + public byte Paren_end() {return paren_end;} private byte paren_end; + public byte Wild() {return wild;} private byte wild; + public Btrie_slim_mgr Trie() {return trie;} private final Btrie_slim_mgr trie; + public byte[] To_bry() { + Bry_bfr bfr = Bry_bfr.new_(); + To_bry__add(bfr, "wild" , wild); + To_bry__add(bfr, "not" , not); + To_bry__add(bfr, "or" , or); + To_bry__add(bfr, "and" , and); + To_bry__add(bfr, "quote" , quote); + To_bry__add(bfr, "paren_bgn" , paren_bgn); + To_bry__add(bfr, "paren_end" , paren_end); + To_bry__add(bfr, "escape" , escape); + To_bry__add(bfr, "space" , space); + return bfr.To_bry_and_clear(); + } + public void Parse(byte[] src) { + byte[][] lines = Bry_split_.Split_lines(src); + escape = space = quote = not = and = or = paren_bgn = paren_end = wild = Byte_.Zero; + for (byte[] line : lines) { + int line_len = line.length; + int eq_pos = Bry_find_.Find_fwd(line, Byte_ascii.Eq, 0, line_len); if (eq_pos == Bry_find_.Not_found) continue; + String key = String_.new_u8(Bry_.Mid(line, 0, eq_pos)); + byte val = Parse__val(line, eq_pos + 1, line_len); + if (String_.Eq(key, "wild" )) wild = val; + else if (String_.Eq(key, "not" )) not = val; + else if (String_.Eq(key, "or" )) or = val; + else if (String_.Eq(key, "and" )) and = val; + else if (String_.Eq(key, "quote" )) quote = val; + else if (String_.Eq(key, "paren_bgn" )) paren_bgn = val; + else if (String_.Eq(key, "paren_end" )) paren_end = val; + else if (String_.Eq(key, "escape" )) escape = val; + else if (String_.Eq(key, "space" )) space = val; + } + } + private static void To_bry__add(Bry_bfr bfr, String key, byte val) { + bfr.Add_str_u8(key).Add_byte_eq(); + switch (val) { + case Byte_ascii.Null : bfr.Add_str_a7("\\0"); break; + case Byte_ascii.Space : bfr.Add_str_a7("\\s"); break; + default : bfr.Add_byte(val); break; + } + bfr.Add_byte_nl(); + } + private static void Make_trie(Btrie_slim_mgr trie, Srch_crt_scanner_syms bldr) { + Make_trie__add(trie, bldr.Escape() , Srch_crt_tkn.Tid__escape); + Make_trie__add(trie, bldr.Space() , Srch_crt_tkn.Tid__space); + Make_trie__add(trie, bldr.Quote() , Srch_crt_tkn.Tid__quote); + Make_trie__add(trie, bldr.Not() , Srch_crt_tkn.Tid__not); + Make_trie__add(trie, bldr.And() , Srch_crt_tkn.Tid__and); + Make_trie__add(trie, bldr.Or() , Srch_crt_tkn.Tid__or); + Make_trie__add(trie, bldr.Paren_bgn() , Srch_crt_tkn.Tid__paren_bgn); + Make_trie__add(trie, bldr.Paren_end() , Srch_crt_tkn.Tid__paren_end); + } + private static void Make_trie__add(Btrie_slim_mgr rv, byte b, byte tid) { + if (b == Byte_ascii.Null) return; + rv.Add_bry_byte(b, tid); + } + public static final Srch_crt_scanner_syms Dflt = + new Srch_crt_scanner_syms + ( Byte_ascii.Backslash, Byte_ascii.Space, Byte_ascii.Quote, Byte_ascii.Dash, Byte_ascii.Plus, Byte_ascii.Comma + , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Star + ); + private static byte Parse__val(byte[] line, int val_bgn, int line_len) { + if (line_len - val_bgn == 1) return line[val_bgn]; + if ( line_len - val_bgn == 2 + && line[val_bgn] == Byte_ascii.Backslash) { + byte val_byte = line[val_bgn + 1]; + switch (val_byte) { + case Byte_ascii.Num_0: return Byte_ascii.Null; + case Byte_ascii.Ltr_s: return Byte_ascii.Space; + } + } + return Byte_ascii.Null; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_tst.java new file mode 100644 index 000000000..4121816b7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_scanner_tst.java @@ -0,0 +1,85 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import org.junit.*; import gplx.xowa.addons.searchs.parsers.*; +public class Srch_crt_scanner_tst { + private final Srch_crt_scanner_fxt fxt = new Srch_crt_scanner_fxt(); + @Test public void Word() {fxt.Test__scan("abc" , "abc");} + @Test public void Word__many() {fxt.Test__scan("abc d ef" , "abc", "d", "ef");} + @Test public void Word__symbol() {fxt.Test__scan("a; b" , "a;", "b");} + @Test public void And() {fxt.Test__scan("a + b" , "a", "+", "b");} + @Test public void And__parens() {fxt.Test__scan("a +(b)" , "a", "+", "(", "b", ")");} // check that ( causes and to be treated as separate word + @Test public void Or() {fxt.Test__scan("a , b" , "a", ",", "b");} + @Test public void Or__no_space() {fxt.Test__scan("a, b" , "a", ",", "b");} + @Test public void Not() {fxt.Test__scan("-abc" , "-", "abc");} + @Test public void Not__mid__1() {fxt.Test__scan("a-b" , "a-b");} // fails if "a", "-", "b" + @Test public void Not__mid__2() {fxt.Test__scan("a b-c" , "a", "b-c");} // ignore - if in middle of word + @Test public void Not__and() {fxt.Test__scan("a -bc" , "a", "-", "bc");} // auto-add AND for - + @Test public void Not__dangling() {fxt.Test__scan("a -" , "a", "-");} + @Test public void Space() {fxt.Test__scan(" a b " , "a", "b");} // spaces should not generate tkns + @Test public void Quote() {fxt.Test__scan("\"a b\"" , "a b");} + @Test public void Quote__mid() {fxt.Test__scan("a\"b" , "a", "b");} + @Test public void Quote__double() {fxt.Test__scan("\"a\"\"b\"" , "a\"b");} + @Test public void Quote__missing__one() {fxt.Test__scan("\"abc" , "abc");} + @Test public void Quote__missing__many() {fxt.Test__scan("\"abc a" , "abc", "a");} + @Test public void Escape__bgn() {fxt.Test__scan("\\-a" , "-a");} // fails if "-", "a" + @Test public void Escape__and__bgn() {fxt.Test__scan("\\+" , "+");} // fails if "a", "&", "b" + @Test public void Escape__and__mid() {fxt.Test__scan("a\\+b" , "a+b");} // fails if "a", "&", "b" + @Test public void Escape__eos__1() {fxt.Test__scan("\\" , String_.Ary_empty);} + @Test public void Escape__eos__2() {fxt.Test__scan("a \\" , "a");} + @Test public void Escape__eos__3() {fxt.Test__scan("a\\" , "a");} + @Test public void Escape__many() {fxt.Test__scan("c\\+\\+" , "c++");} + @Test public void Escape__end() {fxt.Test__scan("a\\\\" , "a\\");} + @Test public void Complicated() {fxt.Test__scan("(a + \"b\") , -c", "(", "a", "+", "b", ")", ",", "-", "c");} +} +class Srch_crt_scanner_fxt { + private final Srch_crt_scanner scanner; + public Srch_crt_scanner_fxt() { + this.scanner = new Srch_crt_scanner(Srch_crt_scanner_syms.Dflt); + Srch_text_parser text_parser = new Srch_text_parser(); + text_parser.Init_for_ttl(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); + } + public void Test__scan(String src_str, String... expd) { + byte[] src_bry = Bry_.new_a7(src_str); + Srch_crt_tkn[] actl_itms = scanner.Scan(src_bry); + Tfds.Eq_ary(expd, To_vals(src_bry, actl_itms)); + } + public void Test__scan_tids(String src_str, byte... expd) { + byte[] src_bry = Bry_.new_a7(src_str); + Srch_crt_tkn[] actl_itms = scanner.Scan(src_bry); + Tfds.Eq_ary(expd, To_tids(actl_itms)); + } + private String[] To_vals(byte[] src, Srch_crt_tkn[] ary) { + int len = ary.length; + String[] rv = new String[len]; + for (int i = 0; i < len; i++) { + Srch_crt_tkn tkn = ary[i]; + rv[i] = String_.new_a7(tkn.Val); + } + return rv; + } + private byte[] To_tids(Srch_crt_tkn[] ary) { + int len = ary.length; + byte[] rv = new byte[len]; + for (int i = 0; i < len; i++) { + Srch_crt_tkn tkn = ary[i]; + rv[i] = tkn.Tid; + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql.java new file mode 100644 index 000000000..3f46066c8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql.java @@ -0,0 +1,76 @@ +/* +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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.langs.regxs.*; +public class Srch_crt_sql { + public Srch_crt_sql(int tid, String eq, String rng_bgn, String rng_end, String like, Gfo_pattern pattern) { + this.Tid = tid; + this.Eq = eq; + this.Rng_bgn = rng_bgn; + this.Rng_end = rng_end; + this.Like = like; + this.Pattern = pattern; + } + public final int Tid; + public final String Eq; + public final String Rng_bgn; + public final String Rng_end; + public final String Like; + public final Gfo_pattern Pattern; // NOTE: only supports LIKE; GLOB requires regex + public int Eq_id; + + public static final int + Tid__eq = 0 // EX: 'ab' -> "word_text = 'ab'" + , Tid__rng = 1 // EX: 'ab*' -> "word_text >= 'ab' AND word_text < 'ac'" + , Tid__like = 2 // EX: 'a*b', '*a*b'-> "word_text LIKE 'a%b%'" + ; + public static Srch_crt_sql New_or_null(byte[] raw, byte wildcard_byte) { + if (raw == null) return null; // null for join itms; EX: "+", "," + int raw_len = raw.length; + + // get tid + int wildcard_pos = Bry_find_.Find_fwd(raw, wildcard_byte, 0, raw_len); + int tid = -1; + if (wildcard_pos == Bry_find_.Not_found) tid = Srch_crt_sql.Tid__eq; // EX: 'a' + else if (wildcard_pos == raw_len - 1) tid = Srch_crt_sql.Tid__rng; // EX: 'a*' + else tid = Srch_crt_sql.Tid__like; // EX: '*a' + + // get rng_bgn, rng_end or like + String eq = "", rng_bgn = "", rng_end = "", like = ""; + byte[] pattern_raw = raw; + switch (tid) { + case Srch_crt_sql.Tid__eq: + eq = String_.new_a7(raw); + break; + case Srch_crt_sql.Tid__rng: + byte[] rng_tmp = Bry_.Mid(raw, 0, raw_len - 1); + rng_bgn = String_.new_u8(rng_tmp); + rng_end = String_.new_u8(gplx.core.intls.Utf8_.Increment_char_at_last_pos(rng_tmp)); + break; + case Srch_crt_sql.Tid__like: + like = String_.new_u8(Bry_.Replace(raw, wildcard_byte, gplx.dbs.sqls.Sql_qry_wtr_.Like_wildcard)); + byte like_escape_byte = gplx.xowa.addons.searchs.searchers.wkrs.Srch_link_wkr_sql.Like_escape_byte; + Bry_bfr tmp_bfr = Bry_bfr_.Get(); + try {pattern_raw = Bry_.Resolve_escape(tmp_bfr, like_escape_byte, raw, 0, raw.length);} + finally {tmp_bfr.Mkr_rls();} + break; + } + Gfo_pattern pattern = tid == Srch_crt_sql.Tid__eq ? null : new Gfo_pattern(pattern_raw); + return new Srch_crt_sql(tid, eq, rng_bgn, rng_end, like, pattern); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql_tst.java new file mode 100644 index 000000000..266f337e7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_sql_tst.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.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import org.junit.*; +public class Srch_crt_sql_tst { + private final Srch_crt_sql_fxt fxt = new Srch_crt_sql_fxt(); + @Test public void Eq() {fxt.Exec__new_or_null("a").Test__tid(Srch_crt_sql.Tid__eq).Test__eq("a");} + @Test public void Rng() {fxt.Exec__new_or_null("a*").Test__tid(Srch_crt_sql.Tid__rng).Test__rng_bgn("a").Test__rng_end("b").Test__pattern("a*");} + @Test public void Like() {fxt.Exec__new_or_null("a*b").Test__tid(Srch_crt_sql.Tid__like).Test__like("a%b").Test__pattern("a*b");} + @Test public void Like__escape() {fxt.Exec__new_or_null("a|\\*b").Test__tid(Srch_crt_sql.Tid__like).Test__like("a|\\%b").Test__pattern("a\\*b");} // "a\*b" + @Test public void Quote() {fxt.Exec__new_or_null("\"a b\"").Test__tid(Srch_crt_sql.Tid__eq).Test__eq("\"a b\"");} +} +class Srch_crt_sql_fxt { + private Srch_crt_sql actl; + public Srch_crt_sql_fxt Exec__new_or_null(String src_str) { + this.actl = Srch_crt_sql.New_or_null(Bry_.new_u8(src_str), Srch_search_addon.Wildcard__star); + return this; + } + public Srch_crt_sql_fxt Test__tid(int expd) {Tfds.Eq(expd, actl.Tid); return this;} + public Srch_crt_sql_fxt Test__eq(String expd) {Tfds.Eq(expd, actl.Eq); return this;} + public Srch_crt_sql_fxt Test__rng_bgn(String expd) {Tfds.Eq(expd, actl.Rng_bgn); return this;} + public Srch_crt_sql_fxt Test__rng_end(String expd) {Tfds.Eq(expd, actl.Rng_end); return this;} + public Srch_crt_sql_fxt Test__like(String expd) {Tfds.Eq(expd, actl.Like); return this;} + public Srch_crt_sql_fxt Test__pattern(String expd) {Tfds.Eq(expd, String_.new_u8(actl.Pattern.Raw()), "pattern"); return this;} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_tkn.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_tkn.java new file mode 100644 index 000000000..7ef71ce0a --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_tkn.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.xowa.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_crt_tkn { + public Srch_crt_tkn(byte tid, byte[] val) {this.Tid = tid; this.Val = val;} + public final byte Tid; + public final byte[] Val; + public static final byte + Tid__escape = 0 + , Tid__space = 1 + , Tid__quote = 2 + , Tid__not = 3 + , Tid__and = 4 + , Tid__or = 5 + , Tid__paren_bgn = 6 + , Tid__paren_end = 7 + , Tid__word = 8 + , Tid__word_w_quote = 9 + , Tid__eos = 10 + , Tid__null = 11 + ; + public static final Srch_crt_tkn[] Ary_empty = new Srch_crt_tkn[0]; +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_visitor.java similarity index 73% rename from 400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java rename to 400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_visitor.java index 65f3ec0f5..0f7895b5d 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/Srch_crt_visitor.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.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -public interface Xosrh_page_mgr_searcher { - List_adp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xows_ns_mgr ns_Mgr, byte[] search); +package gplx.xowa.addons.searchs.searchers.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public interface Srch_crt_visitor { + void Visit(Srch_crt_itm node); } diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__print.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__print.java new file mode 100644 index 000000000..346710758 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__print.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.addons.searchs.searchers.crts.visitors; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_crt_visitor__print implements Srch_crt_visitor { + private final Bry_bfr bfr = Bry_bfr.new_(); + public byte[] Print(Srch_crt_itm root) { + Visit(root); + return bfr.To_bry_and_clear(); + } + public void Visit(Srch_crt_itm node) { + switch (node.Tid) { + case Srch_crt_itm.Tid__word: bfr.Add(node.Raw); break; + case Srch_crt_itm.Tid__word_quote: bfr.Add_byte_quote().Add(node.Raw).Add_byte_quote(); break; + case Srch_crt_itm.Tid__and: + case Srch_crt_itm.Tid__or: + bfr.Add_byte(Byte_ascii.Paren_bgn); + Srch_crt_itm[] subs = node.Subs; + int subs_len = subs.length; + for (int i = 0; i < subs_len; ++i) { + if (i != 0) + bfr.Add_str_a7(node.Tid == Srch_crt_itm.Tid__and ? " AND " : " OR "); + subs[i].Accept_visitor(this); + } + bfr.Add_byte(Byte_ascii.Paren_end); + break; + case Srch_crt_itm.Tid__not: + bfr.Add_str_a7("NOT "); + node.Subs[0].Accept_visitor(this); + break; + case Srch_crt_itm.Tid__invalid: break; // should not happen + default: throw Err_.new_unhandled_default(node.Tid); + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__words.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__words.java new file mode 100644 index 000000000..d32249415 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/crts/visitors/Srch_crt_visitor__words.java @@ -0,0 +1,62 @@ +/* +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.addons.searchs.searchers.crts.visitors; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_crt_visitor__words implements Srch_crt_visitor { + private final List_adp words_list = List_adp_.new_(); + public byte Words_tid() {return words_tid;} private byte words_tid; + public Srch_crt_itm Words_nth() {return words_nth;} private Srch_crt_itm words_nth; + public Srch_crt_itm[] Words_ary() {return (Srch_crt_itm[])words_list.To_ary_and_clear(Srch_crt_itm.class);} + public void Gather(Srch_crt_itm root) { + words_list.Clear(); + words_tid = Srch_crt_mgr.Tid__ands; + words_nth = null; + Visit(root); + if (words_list.Count() == 1) + words_tid = Srch_crt_mgr.Tid__one; + } + public void Visit(Srch_crt_itm itm) { + int itm_tid = itm.Tid; + switch (itm_tid) { + case Srch_crt_itm.Tid__and: + case Srch_crt_itm.Tid__or: + if (itm_tid == Srch_crt_itm.Tid__or) + words_tid = Srch_crt_mgr.Tid__mixed; + Srch_crt_itm[] subs = itm.Subs; + int subs_len = subs.length; + for (int i = 0; i < subs_len; ++i) + Visit(subs[i]); + break; + case Srch_crt_itm.Tid__word: + case Srch_crt_itm.Tid__word_quote: + case Srch_crt_itm.Tid__not: + if ( itm_tid == Srch_crt_itm.Tid__not + && itm.Subs.length == 1) { + Srch_crt_itm lone = itm.Subs[0]; + if ( lone.Tid == Srch_crt_itm.Tid__word + || lone.Tid == Srch_crt_itm.Tid__word_quote) + words_nth = lone; + } + else + words_nth = itm; + words_list.Add(itm); + break; + case Srch_crt_itm.Tid__invalid: break; // should not happen + default: throw Err_.new_unhandled_default(itm.Tid); + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Hash_adp__int.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Hash_adp__int.java new file mode 100644 index 000000000..459b5cb10 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Hash_adp__int.java @@ -0,0 +1,27 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.core.primitives.*; +class Hash_adp__int { + private final Hash_adp hash = Hash_adp_.new_(); + private final Int_obj_ref tmp_key = Int_obj_ref.neg1_(); + public void Clear() {hash.Clear();} + public Object Get_by(int key) {return hash.Get_by(tmp_key.Val_(key));} + public void Add(int key, Object obj) {hash.Add(Int_obj_ref.new_(key), obj);} + public void Add_if_dupe_use_1st(int key, Object obj) {hash.Add_if_dupe_use_1st(Int_obj_ref.new_(key), obj);} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cache.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cache.java new file mode 100644 index 000000000..12b07e58e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cache.java @@ -0,0 +1,32 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_rslt_cache { + private final Hash_adp_bry hash = Hash_adp_bry.cs(); + public void Clear() {hash.Clear();} + public Srch_rslt_list Get_or_new(byte[] key) { + Srch_rslt_list rv = (Srch_rslt_list)hash.Get_by(key); + if (rv == null) { + rv = new Srch_rslt_list(); + hash.Add(key, rv); + } + rv.Rslts_are_first = true; + rv.Rslts_are_enough = false; + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk.java new file mode 100644 index 000000000..2ce1803f8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk.java @@ -0,0 +1,22 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public interface Srch_rslt_cbk { + void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end); + void On_cancel(); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk_.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk_.java new file mode 100644 index 000000000..8c53c2cd3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_cbk_.java @@ -0,0 +1,25 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_rslt_cbk_ { + public static final Srch_rslt_cbk Noop = new Srch_rslt_cbk__noop(); +} +class Srch_rslt_cbk__noop implements Srch_rslt_cbk { + public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) {} + public void On_cancel() {} +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list.java new file mode 100644 index 000000000..438a3fba8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list.java @@ -0,0 +1,62 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_rslt_list { + private final Ordered_hash key_hash = Ordered_hash_.New_bry(); + private final Hash_adp__int id_hash = new Hash_adp__int(); + public int Score_bgn = gplx.dbs.percentiles.Percentile_rng.Score_null; + public int Score_len = gplx.dbs.percentiles.Percentile_rng.Score_null; + public boolean Rslts_are_first; + public boolean Rslts_are_enough; + public boolean Rslts_are_done; + public int Len() {return key_hash.Len();} + public boolean Has(byte[] key) {return key_hash.Has(key);} + public Srch_rslt_row Get_by(byte[] key) {return (Srch_rslt_row)key_hash.Get_by(key);} + public Srch_rslt_row Get_at(int i) {return (Srch_rslt_row)key_hash.Get_at(i);} + public void Clear() {key_hash.Clear(); id_hash.Clear();} + public void Add(Srch_rslt_row row) {key_hash.Add(row.Key, row);} + public void Sort() {key_hash.Sort_by(Srch_rslt_row_sorter.Score_dsc);} + public boolean Ids__has(int id) {return (Srch_rslt_row)id_hash.Get_by(id) != null;} + public Srch_rslt_row Ids__get(int id) {return (Srch_rslt_row)id_hash.Get_by(id);} + public void Ids__add(int id, Srch_rslt_row r) {id_hash.Add(id, r);} + public void Merge(Srch_rslt_list list) { + list.Sort(); + int list_len = list.Len(); + for (int i = 0; i < list_len; ++i) { + Srch_rslt_row row = list.Get_at(i); + this.Add(row); + } + list.Clear(); + } + public void Process_rdr_done(gplx.dbs.percentiles.Percentile_rng rng, boolean rslts_are_enough, boolean rslts_are_done) { + this.Score_bgn = rng.Score_bgn(); + this.Score_len = rng.Score_len(); + this.Rslts_are_enough = rslts_are_enough; + this.Rslts_are_done = rslts_are_done; + } +} +class Srch_rslt_row_sorter implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Srch_rslt_row lhs = (Srch_rslt_row)lhsObj; + Srch_rslt_row rhs = (Srch_rslt_row)rhsObj; + int rv = -Int_.Compare(lhs.Page_score, rhs.Page_score); + if (rv != CompareAble_.Same) return rv; + return Bry_.Compare(lhs.Page_ttl.Page_txt(), rhs.Page_ttl.Page_txt()); + } + public static final Srch_rslt_row_sorter Score_dsc = new Srch_rslt_row_sorter(); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list_.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list_.java new file mode 100644 index 000000000..bc1a5c2a9 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_list_.java @@ -0,0 +1,53 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.xowa.wikis.data.tbls.*; +public class Srch_rslt_list_ { + public static boolean Add_if_new(Srch_search_ctx ctx, Srch_rslt_list rslts, Srch_rslt_row row) { + Srch_rslt_list_.Highlight(ctx, row); // always highlight title first; needed for suggest_box to update highlighting when increasing word; EX: Eart -> Earth; "Earth" should be highlighted, not "Eart" + return + ( !rslts.Has(row.Key) // ignore: page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" + && !rslts.Ids__has(row.Page_id) // ignore: page already added by page-tbl or by redirect + && !Redirect_exists(rslts, row) // ignore: page is redirect, and target page already added + ); + } + public static void Get_redirect_ttl(Xowd_page_tbl page_tbl, Xowd_page_itm tmp_page_itm, Srch_rslt_row row) { + int redirect_id = row.Page_redirect_id; + if (redirect_id == Srch_rslt_row.Page_redirect_id_null) return; + if (!page_tbl.Select_by_id(tmp_page_itm, redirect_id)) {Xoa_app_.Usr_dlg().Warn_many("", "", "page not found for redirect_id; redirect_id=~{0}", redirect_id); return;} + row.Page_redirect_ttl = Xoa_ttl.Replace_unders(tmp_page_itm.Ttl_page_db()); + } + private static void Highlight(Srch_search_ctx ctx, Srch_rslt_row row) { + try {row.Page_ttl_highlight = ctx.Highlight_mgr.Highlight(row.Page_ttl.Full_txt_w_ttl_case());} // NOTE: always highlight row; needed for when search done in url_bar (highlight=n) and then same search reused for search (highlight=y) + catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "highlight failed; ttl=~{0} err=~{1}", row.Page_ttl_wo_ns, Err_.Message_gplx_log(e));} + } + private static boolean Redirect_exists(Srch_rslt_list rslts, Srch_rslt_row cur_row) { + int trg_id = cur_row.Page_redirect_id; + if (trg_id == Srch_rslt_row.Page_redirect_id_null) { // src_page is not redirect + return false; + } else { // src_page is redirect + Srch_rslt_row trg_row = rslts.Ids__get(trg_id); + if (trg_row == null) { // trg_page has not been seen before + rslts.Ids__add(trg_id, cur_row); // add trg_id to known ids; handles double-redirects; 1 -> 2 -> 3; + return false; + } + else // trg_page has been seen before + return true; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_row.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_row.java new file mode 100644 index 000000000..385a1527a --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/rslts/Srch_rslt_row.java @@ -0,0 +1,61 @@ +/* +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.addons.searchs.searchers.rslts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_rslt_row { + public Srch_rslt_row(byte[] key, byte[] wiki_bry, Xoa_ttl page_ttl, int page_ns, byte[] page_ttl_wo_ns, int page_id, int page_len, int page_score, int page_redirect_id) { + this.Key = key; + this.Wiki_bry = wiki_bry; + this.Page_id = page_id; + this.Page_ttl = page_ttl; + this.Page_ns = page_ns; + this.Page_ttl_wo_ns = page_ttl_wo_ns; + this.Page_len = page_len; + this.Page_redirect_id = page_redirect_id; + this.Page_score = page_score; + } + public final byte[] Key; + public final byte[] Wiki_bry; + public final int Page_id; + public final Xoa_ttl Page_ttl; + public final int Page_ns; + public final byte[] Page_ttl_wo_ns; + public final int Page_len; + public final int Page_redirect_id; + public final int Page_score; + public byte[] Page_redirect_ttl; + public byte[] Page_ttl_highlight; + public byte[] Page_ttl_display(boolean html) { + byte[] rv = html ? Page_ttl_highlight : Page_ttl.Full_txt_w_ttl_case(); + if (Page_redirect_id == Page_redirect_id_null) + return rv; + else { + byte[] redirect_dlm = html ? Bry__redirect__html : Bry__redirect__text; + return Bry_.Add(rv, redirect_dlm, Page_redirect_ttl); + } + } + + public static byte[] Bld_key(byte[] wiki_domain, int page_id) {return Bry_.Add(wiki_domain, Byte_ascii.Pipe_bry, Int_.To_bry(page_id));} + public static Srch_rslt_row New(byte[] wiki_bry, Xoa_ttl page_ttl, int page_id, int page_len, int page_score, int redirect_id) { + return new Srch_rslt_row(Bld_key(wiki_bry, page_id), wiki_bry, page_ttl, page_ttl.Ns().Id(), page_ttl.Page_db(), page_id, page_len, page_score, redirect_id); + } + public static final int Page_redirect_id_null = gplx.xowa.wikis.data.tbls.Xowd_page_itm.Redirect_id_null; + public static final String Str__redirect__text = " -> "; + private static final byte[] + Bry__redirect__html = Bry_.new_u8(" → ") // 8592; 8594 + , Bry__redirect__text = Bry_.new_a7(Str__redirect__text); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm.java new file mode 100644 index 000000000..41358a40f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm.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.addons.searchs.searchers.slabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +public class Srch_slab_itm { + public Srch_slab_itm(byte[] wiki, int bgn, int end) {this.wiki = wiki; this.bgn = bgn; this.end = end;} + public byte[] Wiki() {return wiki;} private final byte[] wiki; + public int Bgn() {return bgn;} private final int bgn; + public int End() {return end;} private final int end; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm_parser.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm_parser.java new file mode 100644 index 000000000..42fb7bf98 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/slabs/Srch_slab_itm_parser.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.addons.searchs.searchers.slabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.core.brys.*; +public class Srch_slab_itm_parser { + private final List_adp itm_list = List_adp_.new_(); + private final Bry_rdr rdr = new Bry_rdr(); + public Srch_slab_itm[] Parse(byte[] raw) { // EX: en.wikipedia.org|41|60;en.wiktionary.org|21|40; + rdr.Init_by_src(raw); + while (!rdr.Pos_is_eos()) { + byte[] wiki = rdr.Read_bry_to(Byte_ascii.Pipe); + int bgn = rdr.Read_int_to(Byte_ascii.Pipe); + int end = rdr.Read_int_to(Byte_ascii.Semic); + Srch_slab_itm itm = new Srch_slab_itm(wiki, bgn, end); + itm_list.Add(itm); + } + return (Srch_slab_itm[])itm_list.To_ary_and_clear(Srch_slab_itm.class); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr.java new file mode 100644 index 000000000..87db35a68 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr.java @@ -0,0 +1,163 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.searchers.crts.*; import gplx.xowa.addons.searchs.searchers.rslts.*; import gplx.dbs.percentiles.*; +import gplx.xowa.langs.cases.*; import gplx.xowa.addons.searchs.parsers.*; +public class Srch_link_wkr extends Percentile_select_base { + private final Srch_link_wkr_sql sql_mkr = new Srch_link_wkr_sql(); + private final Db_attach_mgr attach_mgr = new Db_attach_mgr(); + private final Srch_rslt_list tmp_rslts = new Srch_rslt_list(); + private Srch_rslt_list rslts_list; private Srch_rslt_cbk rslt_cbk; private Srch_search_ctx ctx; + private Xowd_page_tbl page_tbl; + private Db_stmt stmt; + private int rslts_bgn, rslts_end; + private Srch_rslt_row cur_row; private final Xowd_page_itm tmp_page_itm = new Xowd_page_itm(); + private int link_tbl_idx, link_tbl_nth; private boolean link_loop_done; + private Srch_crt_itm sql_root; + public void Search(Srch_rslt_list rslts_list, Srch_rslt_cbk rslt_cbk, Srch_search_ctx ctx) { + // init + super.cxl = ctx.Cxl; + super.rng = ctx.Score_rng; + super.rng_log = new Percentile_rng_log(ctx.Addon.Db_mgr().Cfg().Link_score_max()); + rng_log.Init(ctx.Qry.Phrase.Orig, ctx.Rslts_needed); + this.rslts_list = rslts_list; this.rslt_cbk = rslt_cbk; this.ctx = ctx; + this.rslts_bgn = rslts_list.Len(); this.rslts_end = rslts_bgn; + this.page_tbl = ctx.Tbl__page; + + try { + // enough results at start; occurs in Special:Search when revisiting slabs; EX: 1-100 -> 101-200 -> 1-100 + if (ctx.Qry.Slab_end < rslts_list.Len()) { + rslts_list.Rslts_are_enough = true; + rslt_cbk.On_rslts_found(ctx.Qry, rslts_list, 0, rslts_list.Len()); + return; + } + + // prepare for iteration + this.link_tbl_idx = 0; + this.link_tbl_nth = ctx.Tbl__link__ary.length - 1; + sql_root = Srch_link_wkr_.Find_sql_root(ctx); + attach_mgr.Init(new Db_attach_itm("page_db", ctx.Db__core.Conn()), new Db_attach_itm("word_db", ctx.Tbl__word.conn)); + super.Select(); + } + finally { + try { + // gplx.core.consoles.Console_adp__sys.Instance.Write_str_w_nl("detaching: " + String_.new_u8(ctx.Qry.Phrase.Lcase_wild) + " " + Int_.To_str(ctx.Score_rng.Score_bgn()) + " " + Int_.To_str(ctx.Score_rng.Score_end()) + " " + attach_mgr.List__to_str()); + attach_mgr.Detach(); + stmt = Db_stmt_.Rls(stmt); + } + catch (Exception e) { + gplx.core.consoles.Console_adp__sys.Instance.Write_str_w_nl("detaching err: " + String_.new_u8(ctx.Qry.Phrase.Orig) + " " + Int_.To_str(ctx.Score_rng.Score_bgn()) + Err_.Message_lang(e)); + } + } + } + @Override protected Db_rdr Rdr__init() { + try { + Db_conn link_tbl_conn = ctx.Tbl__link__ary[link_tbl_idx].conn; + attach_mgr.Main_conn_(link_tbl_conn); + sql_mkr.Init(ctx, attach_mgr, sql_root); + if (stmt == null) stmt = sql_mkr.Make(ctx, attach_mgr, link_tbl_conn); + sql_mkr.Fill(stmt); + return stmt.Exec_select__rls_manual(); + } finally {sql_mkr.Clear();} + } + @Override protected boolean Found_enough() {return (rslts_list.Len() + tmp_rslts.Len()) >= ctx.Qry.Slab_end;} + @Override protected void Rng__update(int rdr_found) { + link_loop_done = false; + if (ctx.Qry.Ns_mgr.Ns_main_only()) { + link_loop_done = true; + } + else { + if (link_tbl_idx == link_tbl_nth) { + link_tbl_idx = 0; + link_loop_done = true; + } + else { + ++link_tbl_idx; + } + // NOTE: must do detach_database and rls_stmt b/c link_tbl_conn changes + attach_mgr.Detach(); + stmt = Db_stmt_.Rls(stmt); + } + if (link_loop_done) + rng.Update(rslts_end - rslts_bgn); + } + @Override protected void Rdr__done(boolean rslts_are_enough, boolean rslts_are_done) { + if (!link_loop_done) return; + int tmp_rslts_len = tmp_rslts.Len(); + + // get redirect ttl; note that main rdr should be closed + for (int i = 0; i < tmp_rslts_len; ++i) { + Srch_rslt_row row = tmp_rslts.Get_at(i); + int redirect_id = row.Page_redirect_id; + if (redirect_id != Srch_rslt_row.Page_redirect_id_null) + Srch_rslt_list_.Get_redirect_ttl(page_tbl, tmp_page_itm, row); + } + + // merge to rslts_list; notify; cleanup; + if (tmp_rslts_len > 0) rslts_list.Merge(tmp_rslts); + rslts_list.Process_rdr_done(rng, rslts_are_enough, rslts_are_done); + rslt_cbk.On_rslts_found(ctx.Qry, rslts_list, rslts_bgn, rslts_end); + rslts_list.Rslts_are_first = false; + rslts_bgn = rslts_end; + // gplx.core.consoles.Console_adp__sys.Instance.Write_str(rng_log.To_str_and_clear()); + } + @Override protected boolean Row__read(Db_rdr rdr) { + if (!rdr.Move_next()) return false; + byte[] wiki_bry = ctx.Wiki_domain; + int page_id = rdr.Read_int(page_tbl.Fld_page_id()); + byte[] key = Srch_rslt_row.Bld_key(wiki_bry, page_id); + this.cur_row = ctx.Cache__page.Get_by(key); // note that page could have been added from another word + if (cur_row == null) { + int page_len = rdr.Read_int(page_tbl.Fld_page_len()); + int page_score = page_tbl.Fld_page_score() == Dbmeta_fld_itm.Key_null ? page_len : rdr.Read_int(page_tbl.Fld_page_score()); + int page_ns_id = rdr.Read_int(page_tbl.Fld_page_ns()); + byte[] page_ttl_wo_ns = rdr.Read_bry_by_str(page_tbl.Fld_page_title()); + Xoa_ttl page_ttl = ctx.Wiki.Ttl_parse(page_ns_id, page_ttl_wo_ns); + this.cur_row = new Srch_rslt_row(key, wiki_bry, page_ttl, page_ns_id, page_ttl_wo_ns, page_id, page_len, page_score, rdr.Read_int(page_tbl.Fld_redirect_id())); + ctx.Cache__page.Add(cur_row); + } + return true; + } + @Override protected boolean Row__eval() { + if ( !ctx.Qry.Ns_mgr.Has(cur_row.Page_ns) // ignore: ns doesn't match + || !Srch_link_wkr_.Matches(ctx.Crt_mgr__root, ctx.Addon.Ttl_parser(), ctx.Case_mgr, cur_row.Page_ttl_wo_ns) // ignore: ttl doesn't match ttl_matcher; EX: "A B" + ) + return false; + boolean rv = Srch_rslt_list_.Add_if_new(ctx, rslts_list, cur_row); + if (rv) { + ++rslts_end; + rslts_list.Ids__add(cur_row.Page_id, cur_row); + tmp_rslts.Add(cur_row); + } + return rv; + } + public static int Percentile_rng__calc_adj(int last_word_len) { + switch (last_word_len) { + case 1: return 0; + case 2: return 10; + case 3: return 20; + case 4: return 30; + case 5: return 40; + case 6: return 50; + case 7: return 60; + case 8: return 70; + default: return 80; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_.java new file mode 100644 index 000000000..ce872a109 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_.java @@ -0,0 +1,141 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.langs.cases.*; +import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.searchers.crts.*; +class Srch_link_wkr_ { + private static final Srch_word_count_wkr word_count_wkr = new Srch_word_count_wkr(); + public static Srch_crt_itm Find_sql_root(Srch_search_ctx ctx) { + Srch_crt_mgr crt_mgr = ctx.Crt_mgr; + // lookup word_ids; needed for one, mixed, and ands + Srch_crt_itm[] words_ary = crt_mgr.Words_ary; + int words_len = words_ary.length; + for (int i = 0; i < words_len; ++i) { + Srch_crt_itm word = words_ary[i]; + switch (word.Tid) { + case Srch_crt_itm.Tid__word: + if (word.Sql_data.Tid == Srch_crt_sql.Tid__eq) // look up word_id + word.Sql_data.Eq_id = ctx.Tbl__word.Select_or_empty(word.Raw).Id; + break; + case Srch_crt_itm.Tid__word_quote: + Srch_word_row[] rows = Find_sql_root__quoted(ctx, word.Raw); + if (rows != null && rows.length > 0) // override eq_id + word.Sql_data.Eq_id = rows[0].Id; + break; + } + } + + if (crt_mgr.Words_tid != Srch_crt_mgr.Tid__ands) return ctx.Crt_mgr__root; // one and mixed returns root; + + // ands need to do more db_lookup for rng words and identify the sql_root + Srch_crt_itm rv = null; + Srch_word_tbl word_tbl = ctx.Tbl__word; + int count_min = Int_.Max_value; + for (int i = 0; i < words_len; ++i) { + Srch_crt_itm sub = words_ary[i]; + int sub_count = Find_sql_root__ands(ctx, word_tbl, sub); + if (sub_count < count_min) { + count_min = sub_count; + rv = sub; + } + } + return rv; + } + private static Srch_word_row[] Find_sql_root__quoted(Srch_search_ctx ctx, byte[] raw) { + List_adp tmp_list = List_adp_.new_(); + byte[][] ary = Bry_split_.Split(raw, Byte_ascii.Space, Bool_.Y); // TODO: splitting by space is simplistic; should call Srch2_split_words + int words_len = ary.length; + for (int i = 0; i < words_len; ++i) { + byte[] word = ary[i]; + Srch_word_row word_row = ctx.Tbl__word.Select_or_empty(word); if (word_row == Srch_word_row.Empty) continue; + tmp_list.Add(word_row); + } + if (tmp_list.Count() == 0) return null; // no words exist in db; EX: "xyz1 xyz2" + tmp_list.Sort_by(Srch_word_row_sorter__link_count.Desc); + Srch_word_row[] rows = (Srch_word_row[])tmp_list.To_ary_and_clear(Srch_word_row.class); + return rows; + } + private static int Find_sql_root__ands(Srch_search_ctx ctx, Srch_word_tbl word_tbl, Srch_crt_itm sub) { + if (sub.Tid == Srch_crt_itm.Tid__not) return Int_.Max_value; + int cached_count = ctx.Cache__word_counts.Get_as_int_or(sub.Raw, Int_.Min_value); + if (cached_count != Int_.Min_value) return cached_count; + int rv = Int_.Max_value; + if (sub.Sql_data.Tid == Srch_crt_sql.Tid__eq) { + Srch_word_row word = word_tbl.Select_or_empty(sub.Raw); + if (word != Srch_word_row.Empty) rv = word.Link_count; + } + else { + rv = word_count_wkr.Get_top_10(ctx, word_tbl, sub); + } + ctx.Cache__word_counts.Add_bry_int(sub.Raw, rv); + return rv; + } + public static boolean Matches(Srch_crt_itm node, Srch_text_parser text_parser, Xol_case_mgr case_mgr, byte[] ttl) { + byte[] ttl_lower = case_mgr.Case_build_lower(Xoa_ttl.Replace_unders(ttl)); + byte[][] ttl_words = text_parser.Parse_to_bry_ary(Bool_.Y, ttl); + return Matches(node, ttl_lower, ttl_words); + } + private static boolean Matches(Srch_crt_itm node, byte[] ttl_lower, byte[][] ttl_words) { + int tid = node.Tid; + byte[] raw = node.Raw; + Srch_crt_itm[] subs = node.Subs; + int subs_len = subs.length; + switch (tid) { + case Srch_crt_itm.Tid__word: { + int len = ttl_words.length; + for (int i = 0; i < len; ++i) { + byte[] word = ttl_words[i]; + if (node.Sql_data.Pattern == null) { + if (Bry_.Eq(word, raw)) return true; + } + else { + if (node.Sql_data.Pattern.Match(word)) return true; + } + } + return false; + } + case Srch_crt_itm.Tid__word_quote: return Bry_find_.Find_fwd(ttl_lower, raw) != Bry_find_.Not_found;// note that raw does not have quotes; EX: "B*" -> B* + case Srch_crt_itm.Tid__not: return !Matches(subs[0], ttl_lower, ttl_words); + case Srch_crt_itm.Tid__or: { + for (int i = 0; i < subs_len; ++i) { + Srch_crt_itm sub = subs[i]; + if (Matches(sub, ttl_lower, ttl_words)) + return true; + } + return false; + } + case Srch_crt_itm.Tid__and: + for (int i = 0; i < subs_len; ++i) { + Srch_crt_itm sub = subs[i]; + if (!Matches(sub, ttl_lower, ttl_words)) + return false; + } + return true; + case Srch_crt_itm.Tid__invalid: return false; + default: throw Err_.new_unhandled(tid); + } + } +} +class Srch_word_row_sorter__link_count implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Srch_word_row lhs = (Srch_word_row)lhsObj; + Srch_word_row rhs = (Srch_word_row)rhsObj; + return -Int_.Compare(lhs.Link_count, rhs.Link_count); + } + public static final Srch_word_row_sorter__link_count Desc = new Srch_word_row_sorter__link_count(); Srch_word_row_sorter__link_count() {} +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql.java new file mode 100644 index 000000000..f09bdcf42 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql.java @@ -0,0 +1,157 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.dbs.*; import gplx.dbs.stmts.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.searchs.searchers.crts.*; import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_link_wkr_sql { + private final Db_stmt_mgr stmt_mgr = new Db_stmt_mgr(); + public void Clear() {stmt_mgr.Clear();} + public String Dbg(Srch_search_ctx ctx, Db_attach_mgr attach_mgr, Srch_crt_itm sql_root) { + stmt_mgr.Mode_is_stmt_(Bool_.N); + Init(ctx, attach_mgr, sql_root); + stmt_mgr.Mode_is_stmt_(Bool_.Y); + String rv = Write(ctx, attach_mgr); + stmt_mgr.Clear(); + return rv; + } + public void Init(Srch_search_ctx ctx, Db_attach_mgr attach_mgr, Srch_crt_itm sql_root) { + synchronized (Fmt__link) { // THREAD:must synchronized on static Object, else 2 wikis with simultaneous search commands will write to same fmtr + stmt_mgr.Bfr().Add(Bry__page__bgn); + Bld_where(ctx, sql_root); + stmt_mgr.Bfr().Add(Bry__page__end); + } + } + public String Write(Srch_search_ctx ctx, Db_attach_mgr attach_mgr) { + String sql = stmt_mgr.Bfr().To_str_and_clear(); + try { + // gplx.core.consoles.Console_adp__sys.Instance.Write_str_w_nl("attaching: " + String_.new_u8(ctx.Qry.Phrase.Lcase_wild) + " " + Int_.To_str(ctx.Score_rng.Score_bgn()) + " " + Int_.To_str(ctx.Score_rng.Score_end()) + " " + attach_mgr.List__to_str()); + sql = attach_mgr.Resolve_sql(sql); + } + catch (Exception e) { + gplx.core.consoles.Console_adp__sys.Instance.Write_str_w_nl("attaching err: " + String_.new_u8(ctx.Qry.Phrase.Orig) + " " + Int_.To_str(ctx.Score_rng.Score_bgn()) + " " + Int_.To_str(ctx.Score_rng.Score_end()) + Err_.Message_lang(e)); + } + return sql; + } + public Db_stmt Make(Srch_search_ctx ctx, Db_attach_mgr attach_mgr, Db_conn cur_link_conn) { + String sql = Write(ctx, attach_mgr); + attach_mgr.Attach(); + return cur_link_conn.Stmt_sql(sql); + } + public void Fill(Db_stmt stmt) { + // gplx.core.consoles.Console_adp__sys.Instance.Write_str_w_nl(String_.new_u8(ctx.Qry.Phrase.Orig) + " " + Int_.To_str(ctx.Score_rng.Score_bgn()) + " " + Int_.To_str(ctx.Score_rng.Score_end())); + stmt_mgr.Fill_stmt_and_clear(stmt); + } + private void Bld_where(Srch_search_ctx ctx, Srch_crt_itm node) { + switch (node.Tid) { + case Srch_crt_itm.Tid__word: + case Srch_crt_itm.Tid__word_quote: // NOTE: quoted word is treated as Eq, except Eq_id is set to "lowest" word_id + Bld_leaf(ctx, node); + break; + case Srch_crt_itm.Tid__or: + case Srch_crt_itm.Tid__and: + Srch_crt_itm[] subs = node.Subs; + int subs_len = subs.length; + for (int i = 0; i < subs_len; ++i) { + Srch_crt_itm sub = subs[i]; + if (sub.Tid == Srch_crt_itm.Tid__not) continue; // do not build sql for NOT itms; EX: a + (b, c) + -d + if (i != 0) + stmt_mgr.Bfr().Add_str_a7(node.Tid == Srch_crt_itm.Tid__and ? "INTERSECT\n" : "UNION\n"); + Bld_where(ctx, sub); + } + break; + case Srch_crt_itm.Tid__not: break; // never check database for NOT node + case Srch_crt_itm.Tid__invalid: break; // should not happen + default: throw Err_.new_unhandled_default(node.Tid); + } + } + private void Bld_leaf(Srch_search_ctx ctx, Srch_crt_itm node) { + int node_idx = node.Idx; + int node_sql_tid = node.Sql_data.Tid; + int score_bgn = ctx.Score_rng.Score_bgn(); + int score_end = ctx.Score_rng.Score_end(); + Srch_word_tbl word_tbl = ctx.Tbl__word; + stmt_mgr.Bfr().Add(Bry__link__bgn); + switch (node_sql_tid) { + case Srch_crt_sql.Tid__eq: // EX: "earth" + stmt_mgr.Add_crt_int(word_tbl.fld_id, node.Sql_data.Eq_id); + stmt_mgr.Write_fmt(Fmt__word_id); + break; + case Srch_crt_sql.Tid__rng: // EX: "earth*" + stmt_mgr.Add_var_many(node_idx, "AND ", "search_word__word_text__link_score_max__link_score_min"); + stmt_mgr.Add_crt_str(word_tbl.fld_text, node.Sql_data.Rng_bgn); + stmt_mgr.Add_crt_str(word_tbl.fld_text, node.Sql_data.Rng_end); + stmt_mgr.Add_crt_int(word_tbl.fld_link_score_max, score_bgn); + stmt_mgr.Add_crt_int(word_tbl.fld_link_score_min, score_end); + stmt_mgr.Write_fmt(Fmt__word_text__rng); + break; + case Srch_crt_sql.Tid__like: // EX: "*earth" + stmt_mgr.Add_var_many(node_idx, "WHERE ", "search_word__link_score_max__link_score_min"); + stmt_mgr.Add_crt_int(word_tbl.fld_link_score_max, score_bgn); + stmt_mgr.Add_crt_int(word_tbl.fld_link_score_min, score_end); + stmt_mgr.Add_crt_str(word_tbl.fld_text, node.Sql_data.Like); + stmt_mgr.Write_fmt(Fmt__word_text__like); + break; + } + Srch_link_tbl link_tbl = ctx.Tbl__link__ary[0]; + stmt_mgr.Add_crt_int(link_tbl.fld_link_score, score_bgn); + stmt_mgr.Add_crt_int(link_tbl.fld_link_score, score_end); + stmt_mgr.Write_fmt(Fmt__link); + } + private static final byte[] + Bry__page__bgn = Bry_.new_a7(String_.Concat_lines_nl_skip_last + ( "SELECT p.page_id, p.page_namespace, p.page_title, p.page_len, p.page_score, p.page_redirect_id" + , "FROM page p" + , "WHERE p.page_id IN" + , "(" + , "" + )) + , Bry__page__end = Bry_.new_a7(")\n") + , Bry__link__bgn = Bry_.new_a7(String_.Concat_lines_nl_skip_last + ( "SELECT l.page_id" + , "FROM search_link l INDEXED BY search_link__word_id__link_score" + , "WHERE " + )) + ; + private static final String + Str__link__end = String_.Concat_lines_nl_skip_last + ( "AND l.link_score >= ~{score_bgn}" + , "AND l.link_score < ~{score_end}" + , "" + ) + , Str__word__text__bgn = String_.Concat_lines_nl_skip_last + ( "l.word_id IN" + , "(" + , "SELECT w~{uid}.word_id" + , "FROM search_word w~{uid} INDEXED BY ~{index}" + , "" + ) + , Str__word__text__rng = "WHERE w~{uid}.word_text >= ~{word_bgn} AND w~{uid}.word_text < ~{word_end}\n" + , Str__word__text__like = "AND w~{uid}.word_text LIKE ~{word_like} ESCAPE '|'\n" + , Str__word__text__mnx = String_.Concat_lines_nl_skip_last + ( "~{and} w~{uid}.link_score_max >= ~{score_bgn}" + , "AND w~{uid}.link_score_min < ~{score_end}" + , "" + ); + private static final Bry_fmt + Fmt__link = Bry_fmt.Auto(Str__link__end) + , Fmt__word_id = Bry_fmt.Auto("l.word_id = ~{word_uid}\n") + , Fmt__word_text__rng = Bry_fmt.New(Str__word__text__bgn + Str__word__text__rng + Str__word__text__mnx + ")\n", "uid", "and", "index", "word_bgn", "word_end", "score_bgn", "score_end") + , Fmt__word_text__like = Bry_fmt.New(Str__word__text__bgn + Str__word__text__mnx + Str__word__text__like + ")\n", "uid", "and", "index", "score_bgn", "score_end", "word_like") + ; + public static final byte Like_escape_byte = Byte_ascii.Pipe; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql_tst.java new file mode 100644 index 000000000..6d05a2828 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_link_wkr_sql_tst.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import org.junit.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.crts.*; import gplx.xowa.addons.searchs.searchers.crts.visitors.*; +public class Srch_link_wkr_sql_tst { + private final Srch_link_wkr_sql_fxt fxt = new Srch_link_wkr_sql_fxt(); + @Test public void Rng() { + fxt.Run__search("a").Test__eq + ( "select" + ); + } +} +class Srch_link_wkr_sql_fxt { + private final Srch_link_wkr_sql link_wkr = new Srch_link_wkr_sql(); + public Srch_link_wkr_sql_fxt Run__search(String search) { + // attach_mgr.Init(cur_link_tbl.conn, new Db_attach_itm("page_db", ctx.Db__core.Conn()), new Db_attach_itm("word_db", ctx.Tbl__word.conn)); + // link_wkr.Init(ctx, attach_mgr); + // this.actl_sql = link_wkr.Write(ctx, attach_mgr); + link_wkr.Clear(); + return this; + } + public void Test__eq(String... v) { + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr.java new file mode 100644 index 000000000..02c2e4286 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr.java @@ -0,0 +1,72 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; +import gplx.xowa.addons.searchs.searchers.crts.*; +public class Srch_page_tbl_wkr { + private final Xowd_page_itm tmp_page_row = new Xowd_page_itm(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + public void Search(Srch_search_ctx ctx, Srch_rslt_cbk cbk) { + byte[] search_raw = To_bry_or_null(tmp_bfr, ctx.Scanner_syms.Wild(), ctx.Crt_mgr); // build up search String but handle escapes "\+" -> "+" + if (search_raw == null) return; // search-term has not or symbols; EX: "earth -history"; "(earth & history)" + Xoa_ttl ttl = ctx.Wiki.Ttl_parse(search_raw); if (ttl == null) return; + Xowd_page_tbl page_tbl = ctx.Tbl__page; + if (ctx.Cxl.Canceled()) return; + if (page_tbl.Select_by_ttl(tmp_page_row, ttl.Ns(), ttl.Page_db())) { + if (ctx.Cxl.Canceled()) return; + Srch_rslt_row row = Srch_rslt_row.New(ctx.Wiki_domain, ttl, tmp_page_row.Id(), tmp_page_row.Text_len(), ctx.Addon.Db_mgr().Cfg().Link_score_max() * 3, tmp_page_row.Redirect_id()); + if (Srch_rslt_list_.Add_if_new(ctx, ctx.Rslts_list, row)) { + Srch_rslt_list_.Get_redirect_ttl(page_tbl, tmp_page_row, row); + ctx.Rslts_list.Add(row); + ctx.Rslts_list.Ids__add(row.Page_id, row); + cbk.On_rslts_found(ctx.Qry, ctx.Rslts_list, 0, 1); + ctx.Rslts_list.Rslts_are_first = false; + } + } + } + public static byte[] To_bry_or_null(Bry_bfr bfr, byte wildcard_byte, Srch_crt_mgr mgr) { + if (mgr.Words_tid == Srch_crt_mgr.Tid__mixed) return null; + Srch_crt_tkn[] tkns = mgr.Tkns; + int len = tkns.length; + for (int i = 0; i < len; ++i) { + Srch_crt_tkn tkn = tkns[i]; + switch (tkn.Tid) { + case Srch_crt_tkn.Tid__word: + case Srch_crt_tkn.Tid__word_w_quote: + break; + default: + return null; + } + if (i != 0) bfr.Add_byte_space(); + byte[] tkn_raw = tkn.Val; + int tkn_raw_len = tkn_raw.length; + int wildcard_pos = Bry_find_.Find_fwd(tkn_raw, wildcard_byte, 0, tkn_raw_len); + if (wildcard_pos != Bry_find_.Not_found) { + int last_pos = tkn_raw_len - 1; + if (wildcard_pos == last_pos) + bfr.Add_mid(tkn_raw, 0, last_pos); + else + return null; + } + else + bfr.Add(tkn.Val); + } + return bfr.To_bry_and_clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr_tst.java new file mode 100644 index 000000000..be88b6a45 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_page_tbl_wkr_tst.java @@ -0,0 +1,47 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import org.junit.*; import gplx.xowa.addons.searchs.parsers.*; import gplx.xowa.addons.searchs.searchers.crts.*; import gplx.xowa.addons.searchs.searchers.crts.visitors.*; +public class Srch_page_tbl_wkr_tst { + private final Srch_page_tbl_wkr_fxt fxt = new Srch_page_tbl_wkr_fxt(); + @Test public void Word__one() {fxt.Test__to_bry_or_null("a" , "a");} + @Test public void Word__many() {fxt.Test__to_bry_or_null("a b c" , "a b c");} + @Test public void Wild__end() {fxt.Test__to_bry_or_null("a*" , "a");} + @Test public void Wild__both() {fxt.Test__to_bry_or_null("a*b*" , null);} + @Test public void Quote() {fxt.Test__to_bry_or_null("\"a b\"" , "a b");} + @Test public void Quote__mixed() {fxt.Test__to_bry_or_null("a \"b \"\" c\" d" , "a b \" c d");} + @Test public void Escape() {fxt.Test__to_bry_or_null("a\\+" , "a+");} + @Test public void Not() {fxt.Test__to_bry_or_null("a -b" , null);} + @Test public void And() {fxt.Test__to_bry_or_null("a + b" , null);} + @Test public void Or() {fxt.Test__to_bry_or_null("a , b" , null);} + @Test public void Parens() {fxt.Test__to_bry_or_null("(a)" , null);} +} +class Srch_page_tbl_wkr_fxt { + private final Srch_crt_parser crt_parser; + private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + public Srch_page_tbl_wkr_fxt() { + crt_parser = new Srch_crt_parser(Srch_crt_scanner_syms.Dflt); + Srch_text_parser text_parser = new Srch_text_parser(); + text_parser.Init_for_ttl(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); + } + public void Test__to_bry_or_null(String src_str, String expd) { + byte[] src_bry = Bry_.new_a7(src_str); + Srch_crt_mgr crt_mgr = crt_parser.Parse_or_invalid(src_bry, Bool_.N); + Tfds.Eq(expd, String_.new_u8(Srch_page_tbl_wkr.To_bry_or_null(tmp_bfr, Srch_search_addon.Wildcard__star, crt_mgr))); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_word_count_wkr.java b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_word_count_wkr.java new file mode 100644 index 000000000..44bb20c5e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/searchers/wkrs/Srch_word_count_wkr.java @@ -0,0 +1,78 @@ +/* +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.addons.searchs.searchers.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.dbs.*; import gplx.dbs.stmts.*; import gplx.dbs.percentiles.*; +import gplx.xowa.addons.searchs.dbs.*; import gplx.xowa.addons.searchs.searchers.crts.*; +class Srch_word_count_wkr extends Percentile_select_base { + private Srch_word_tbl word_tbl; private Srch_db_cfg db_cfg; + private Srch_crt_itm sub; + private int total_link_count, rows_read; private boolean score_too_low; + private final Db_stmt_mgr stmt_mgr = new Db_stmt_mgr(); private Db_stmt stmt; + public int Get_top_10(Srch_search_ctx ctx, Srch_word_tbl word_tbl, Srch_crt_itm sub) { + super.cxl = ctx.Cxl; + this.db_cfg = ctx.Addon.Db_mgr().Cfg(); + super.rng = new Percentile_rng().Init(db_cfg.Word_count(), db_cfg.Link_count_score_max()); + super.rng.Select_init(10, Percentile_rng.Score_null, Percentile_rng.Score_null, 0); + super.rng_log = new Percentile_rng_log(db_cfg.Link_count_score_max()); + + rng_log.Init(sub.Raw, 10); + this.word_tbl = word_tbl; + this.sub = sub; + this.total_link_count = 0; + this.rows_read = 0; + this.score_too_low = false; + try {this.Select();} + finally {stmt = Db_stmt_.Rls(stmt);} + if (score_too_low) return Srch_db_cfg_.Link_count_score_cutoff; + else if (rows_read == 1) return total_link_count * 2; + else return total_link_count; + } + @Override protected Db_rdr Rdr__init() { + stmt_mgr.Add_crt_int(word_tbl.fld_link_count_score, rng.Score_bgn()); + stmt_mgr.Add_crt_int(word_tbl.fld_link_count_score, rng.Score_end()); + stmt_mgr.Add_crt_str(word_tbl.fld_text, sub.Sql_data.Rng_bgn); + stmt_mgr.Add_crt_str(word_tbl.fld_text, sub.Sql_data.Rng_end); + if (stmt == null) stmt = stmt_mgr.Make_stmt(word_tbl.conn, Fmt__main); + stmt_mgr.Fill_stmt_and_clear(stmt); + return stmt.Exec_select__rls_manual(); + } + @Override protected boolean Row__read(Db_rdr rdr) { + if (!rdr.Move_next()) return false; + int cur_link_count = rdr.Read_int(word_tbl.fld_link_count); + total_link_count += cur_link_count; + ++rows_read; + return true; + } + @Override protected boolean Found_enough() { + if (rng.Score_bgn() <= db_cfg.Link_count_score_cutoff()) score_too_low = true; + return rows_read > 0 || score_too_low; + } + @Override protected void Rdr__done(boolean rslts_are_enough, boolean rslts_are_done) { + // if (rslts_are_enough) gplx.core.consoles.Console_adp__sys.Instance.Write_str(rng_log.To_str_and_clear()); + } + private static Bry_fmt + Fmt__main = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last + ( "SELECT w.link_count" + , "FROM search_word w INDEXED BY search_word__link_count_score__word_text" + , "WHERE w.link_count_score >= ~{score_min}" + , "AND w.link_count_score < ~{score_max}" + , "AND w.word_text >= ~{rng_bgn}" + , "AND w.word_text < ~{rng_end}" + , "LIMIT 1" + )); +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_qarg_mgr.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_qarg_mgr.java new file mode 100644 index 000000000..6a60fc428 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_qarg_mgr.java @@ -0,0 +1,68 @@ +/* +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.addons.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.net.*; +import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_qarg_mgr { + public Srch_qarg_mgr(Srch_ns_mgr ns_mgr) {this.ns_mgr = ns_mgr;} + public Srch_ns_mgr Ns_mgr() {return ns_mgr;} private final Srch_ns_mgr ns_mgr; + public byte[] Search_raw() {return search_raw;} private byte[] search_raw; public Srch_qarg_mgr Search_raw_(byte[] v) {search_raw = v; return this;} + public int Slab_idx() {return slab_idx;} private int slab_idx; + public byte[] Cancel() {return cancel;} private byte[] cancel; + public boolean Simple_search() {return simple_search;} private boolean simple_search; + public Srch_qarg_mgr Clear() { + ns_mgr.Clear(); + this.search_raw = null; + this.slab_idx = 0; + this.cancel = null; + this.simple_search = false; + return this; + } + public void Parse(Gfo_qarg_itm[] qargs_ary) { + if (qargs_ary == null) return; + int len = qargs_ary.length; + for (int i = 0; i < len; ++i) { + Gfo_qarg_itm qarg = qargs_ary[i]; + byte[] key = qarg.Key_bry(); + byte tid = qarg_regy.Get_as_byte_or(key, Byte_.Max_value_127); + if (tid == Byte_.Max_value_127) { // unknown qarg; check for ns*; EX: &ns0=1&ns8=1; NOTE: lowercase only + if (Bry_.Has_at_bgn(key, Ns_bry)) + ns_mgr.Add_by_parse(key, qarg.Val_bry()); + } + else { + switch (tid) { + case Uid__search: this.search_raw = Bry_.Replace(qarg.Val_bry(), Byte_ascii.Plus, Byte_ascii.Space); break; + case Uid__slab_idx: this.slab_idx = Bry_.To_int_or(qarg.Val_bry(), 0); break; + case Uid__cancel: this.cancel = qarg.Val_bry(); break; + case Uid__simple_search: this.simple_search = Bry_.Eq(qarg.Val_bry(), Bool_.Y_bry); break; + default: break; + } + } + } + ns_mgr.Add_main_if_empty(); + } + private static byte[] Ns_bry = Bry_.new_a7("ns"); + private static final byte Uid__search = 0, Uid__slab_idx = 1, Uid__cancel = 2, Uid__simple_search = 3; + public static final byte[] Bry__slab_idx = Bry_.new_a7("xowa_page_index"), Bry__cancel = Bry_.new_a7("cancel"); + private static final Hash_adp_bry qarg_regy = Hash_adp_bry.ci_a7() + .Add_str_byte("search" , Uid__search) + .Add_bry_byte(Bry__slab_idx , Uid__slab_idx) + .Add_bry_byte(Bry__cancel , Uid__cancel) + .Add_str_byte("simple_search" , Uid__simple_search) + ; +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_cmd.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_cmd.java new file mode 100644 index 000000000..a7f75cc6e --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_cmd.java @@ -0,0 +1,105 @@ +/* +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.addons.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.core.threads.*; +import gplx.xowa.files.gui.*; import gplx.xowa.guis.views.*; +import gplx.xowa.addons.searchs.specials.htmls.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_special_cmd implements GfoInvkAble, Srch_rslt_cbk, Xog_tab_close_lnr { + private final Srch_special_searcher mgr; private final Srch_search_qry qry; + public final Xow_wiki wiki; private final Xog_tab_close_mgr tab_close_mgr; private final Xog_js_wkr js_wkr; + private Srch_html_row_wkr html_row_wkr; private final boolean async; + public final byte[] key; private boolean canceled = false; + public Srch_special_cmd(Srch_special_searcher mgr, Srch_search_qry qry, Xow_wiki wiki, Xog_tab_close_mgr tab_close_mgr, Xog_js_wkr js_wkr, byte[] key, boolean search_is_async) { + this.mgr = mgr; this.qry = qry; this.wiki = wiki; this.tab_close_mgr = tab_close_mgr; this.js_wkr = js_wkr; this.key = key; + this.async = wiki.App().Mode().Tid_is_gui() && search_is_async; + } + public void On_cancel() { + canceled = true; + Xoa_app_.Usr_dlg().Prog_many("", "", "search canceled: key=~{0}", key); + this.Hide_cancel_btn(); + } + public void Search() { + if (async) { // NOTE: async useful with multiple wikis; allows parallel searches; + Srch_html_row_bldr html_row_bldr = new Srch_html_row_bldr(new gplx.xowa.htmls.core.htmls.utls.Xoh_lnki_bldr(wiki.App(), wiki.App().Html__href_wtr())); + html_row_wkr = new Srch_html_row_wkr(html_row_bldr, js_wkr, qry.Slab_end - qry.Slab_bgn, wiki.Domain_bry()); + Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_search_db, this, Invk_search_db).Start(); + } + else + Search_db(); + } + private void Search_db() { + synchronized (mgr) { // THREAD: needed else multiple Special:Search pages will fail at startup; DATE:2016-03-27 + tab_close_mgr.Add(this); + // DEPRECATE: causes search to fail when using go back / go forward; DELETE:2016-05; DATE:2016-03-27 + // if (async) { + // while (!page.Html_data().Mode_wtxt_shown()) // NOTE:must check to see if page is shown; else async can happen first, and then be overwritten by page_showing; DATE:2015-04-26 + // Thread_adp_.Sleep(100); + // } + Srch_search_addon.Get(wiki).Search(qry, this); + mgr.Search__done(this); + if (canceled) return; // NOTE: must check else throws SWT exception + this.Hide_cancel_btn(); + } + Xoa_app_.Usr_dlg().Prog_many("", "", ""); + } + private void Hide_cancel_btn() {Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_search_cancel, this, Invk_hide_cancel).Start();} + private void Hide_cancel_btn_async() {js_wkr.Html_atr_set("xowa_cancel_" + wiki.Domain_str(), "style", "display:none;");} + public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + if (rslts_list.Rslts_are_first) { + if (rslts_bgn > qry.Slab_bgn) { + for (int i = qry.Slab_bgn; i < rslts_bgn; ++i) { + Srch_rslt_row row = rslts_list.Get_at(i); + html_row_wkr.On_rslt_found(row); + } + } + } + for (int i = rslts_bgn; i < rslts_end; ++i) { + if (i < qry.Slab_bgn) continue; // do not write row if < slab_bgn; occurs when restarting app directly at page > 1; EX: 11-20 requested; 1-20 returned; do not write 1-10; + if (i >= qry.Slab_end) break; // do not write row if > slab_end; occurs when paging forward; EX: 01-10 requested; 1-12 retrieved; do not write 11, 12 + Srch_rslt_row row = rslts_list.Get_at(i); + html_row_wkr.On_rslt_found(row); + } + } + 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.Qargs_mgr().Get_val_bry_or(Srch_qarg_mgr.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.On_cancel(); + return true; + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_search_db)) Search_db(); + else if (ctx.Match(k, Invk_hide_cancel)) Hide_cancel_btn_async(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String Invk_search_db = "search_db", Invk_hide_cancel = "hide_cancel"; +} +/* +NOTE:show_existing. code needed to show A1 +EX: search="A*": "A" has 400 words; "A1" has 1; +. search 1-20 returns 20 words for A and 1 word for A1. +.. the 1st A word has a len of 999 and the 20th A word has a length of 900; +.. A1 has a length of 799 +. search 21-40 returns 20 words for A +.. the 21st word has a len of 899 and the 40th has a len of 800 +.. A1 should show up briefly, and then get pushed off screen by 21-40 +. search 61-40 returns 20 words for A +.. A1 must show up +*/ diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_page.java similarity index 53% rename from 400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java rename to 400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_page.java index 08fea7f6d..ffb6fd04e 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_page.java @@ -15,73 +15,67 @@ 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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +package gplx.xowa.addons.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.core.primitives.*; import gplx.xowa.apps.apis.xowa.specials.*; -import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; -public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { - private final Xoae_app app; private final Xow_domain_itm wiki_domain; private final Xoapi_search search_api; - private final Xows_core search_mgr; private final Xows_arg_mgr args_mgr = new Xows_arg_mgr(); +import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; +import gplx.xowa.specials.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.cbks.*; +public class Srch_special_page implements Xows_page, GfoInvkAble, GfoEvObj { + private final Xoae_app app; private final Xow_domain_itm wiki_domain; private final Xoapi_search search_api; + private final Srch_special_searcher search_mgr; private final Srch_qarg_mgr qargs_mgr; private Xow_domain_itm[] search_domain_ary; - public Xows_page__search(Xowe_wiki wiki) { + public Srch_special_page(Xowe_wiki wiki) { + this.ev_mgr = GfoEvMgr.new_(this); this.app = wiki.Appe(); this.wiki_domain = wiki.Domain_itm(); - this.search_mgr = new Xows_core(wiki.Appe().Wiki_mgr()); - this.ev_mgr = GfoEvMgr.new_(this); + this.search_mgr = new Srch_special_searcher(wiki.Appe().Wiki_mgr()); this.search_api = wiki.Appe().Api_root().Special().Search(); + this.qargs_mgr = new Srch_qarg_mgr(app.Gui_mgr().Search_cfg().Ns_mgr()); GfoEvMgr_.SubSame_many(search_api, this, Xoapi_search.Evt_multi_wikis_changed, Xoapi_search.Evt_multi_wikis_changed); } - public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr; - public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__search;} - private void Multi_wikis_changed() { - Xow_domain_crt_itm crt = search_api.Multi_wikis_crt(wiki_domain); - this.search_domain_ary = Get_by_crt(app.Usere().Wiki().Xwiki_mgr(), wiki_domain, crt); - if (search_domain_ary.length == 0) search_domain_ary = new Xow_domain_itm[] {wiki_domain}; // default to current if bad input - Multi_sorts_changed(); - } - private void Multi_sorts_changed() { - Xow_domain_crt_itm[] ary = search_api.Multi_sorts_crt(wiki_domain); - if (ary == null) return; // default to no sort if bad input - Xow_domain_sorter__manual sorter = new Xow_domain_sorter__manual(wiki_domain, ary); - Xow_domain_sorter__manual.Sort(sorter, search_domain_ary); - } + public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; + public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__search;} public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { - if (wiki.Domain_tid() == Xow_domain_tid_.Int__home) return; // do not allow search in home wiki; will throw null ref error b/c no search_ttl dirs if (search_domain_ary == null) Multi_wikis_changed(); - // get args - 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.Qargs_ary()); - args_mgr.Ns_mgr().Add_main_if_empty(); - // get search_bry - byte[] search_bry = args_mgr.Search_bry(); - if (search_bry == null) { // search is not in qarg; EX:Special:Search?search=Earth - search_bry = ttl.Leaf_txt_wo_qarg(); // assume search is in leaf; EX: Special:Search/Earth - args_mgr.Search_bry_(search_bry); + + // get args from urls while applying defaults from search_cfg + Srch_search_cfg search_cfg = wiki.Appe().Gui_mgr().Search_cfg(); + qargs_mgr.Clear(); + qargs_mgr.Parse(search_cfg.Args_default()); + qargs_mgr.Parse(url.Qargs_ary()); + qargs_mgr.Ns_mgr().Add_main_if_empty(); + + // get search_raw + byte[] search_raw = qargs_mgr.Search_raw(); + if (search_raw == null) { // search is not in qarg; EX:Special:Search?search=Earth + search_raw = ttl.Leaf_txt_wo_qarg(); // assume search is in leaf; EX: Special:Search/Earth + qargs_mgr.Search_raw_(search_raw); } - if (Bry_.Len_eq_0(search_bry)) return; // emptry String; exit now, else null ref error; DATE:2015-08-11 - if ( search_suggest_mgr.Auto_wildcard() // add * automatically if option set + if (Bry_.Len_eq_0(search_raw)) return; // emptry String; exit now, else null ref error; DATE:2015-08-11 + if ( search_cfg.Auto_wildcard() // add * automatically if option set && wiki.Db_mgr().Tid() == gplx.xowa.wikis.dbs.Xodb_mgr_sql.Tid_sql // only apply to sql - && Bry_find_.Find_fwd(search_bry, Byte_ascii.Star) == -1 // search term does not have asterisk + && Bry_find_.Find_fwd(search_raw, Srch_search_addon.Wildcard__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 - // search wiki - Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_bry); + search_raw = Bry_.Add(search_raw, Srch_search_addon.Wildcard__star); + + // get page directly from url + boolean fulltext_invoked = url.Qargs_mgr().Match(Qarg__fulltext, Qarg__fulltext__y); + Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_raw); 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 + if ( !fulltext_invoked + && !Bry_.Eq(search_raw, Xows_special_meta_.Itm__search.Ttl_bry())) // do not lookup self 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.Qargs_mgr().Match(Qarg__fulltext, Qarg__fulltext__y)) { - if (args_mgr.Cancel() != null) { - search_mgr.Cancel(args_mgr.Cancel()); + if (search_page.Missing() || fulltext_invoked) { + if (qargs_mgr.Cancel() != null) { // cancel any existing searches + search_mgr.Search__cancel(qargs_mgr.Cancel()); page.Tab_data().Cancel_show_y_(); return; } page.Html_data().Html_restricted_n_(); - page.Html_data().Xtn_search_text_(search_bry); - Srch_qry qry = new Srch_qry(search_bry, args_mgr.Paging_idx(), search_api.Results_per_page(), args_mgr.Ns_mgr(), search_api.Async_db(), search_domain_ary); - search_mgr.Search(wiki, page, qry); + page.Html_data().Xtn_search_text_(search_raw); + Srch_search_qry qry = Srch_search_qry.New__search_page(search_domain_ary, wiki, search_cfg, qargs_mgr.Simple_search(), search_raw, qargs_mgr.Slab_idx(), search_api.Results_per_page()); + search_mgr.Search(wiki, page, search_api.Async_db(), search_domain_ary, qry); } // page found; return it; else { @@ -89,9 +83,21 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { page.Data_raw_(search_page.Data_raw()); if (page.Root() != null) // NOTE: null when going from w:Earth -> q:Earth; DATE:2013-03-20 page.Root().Data_htm_(search_page.Root().Data_htm()); - page.Ttl_(search_ttl).Url_(Xoa_url.new_(wiki.Domain_bry(), search_ttl.Full_txt())).Redirected_(true); + page.Ttl_(search_ttl).Url_(Xoa_url.new_(wiki.Domain_bry(), search_ttl.Full_txt_w_ttl_case())).Redirected_(true); } } + private void Multi_wikis_changed() { + Xow_domain_crt_itm crt = search_api.Multi_wikis_crt(wiki_domain); + this.search_domain_ary = Get_by_crt(app.Usere().Wiki().Xwiki_mgr(), wiki_domain, crt); + if (search_domain_ary.length == 0) search_domain_ary = new Xow_domain_itm[] {wiki_domain}; // default to current if bad input + Multi_sorts_changed(); + } + private void Multi_sorts_changed() { + Xow_domain_crt_itm[] ary = search_api.Multi_sorts_crt(wiki_domain); + if (ary == null) return; // default to no sort if bad input + Xow_domain_sorter__manual sorter = new Xow_domain_sorter__manual(wiki_domain, ary); + Xow_domain_sorter__manual.Sort(sorter, search_domain_ary); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Xoapi_search.Evt_multi_wikis_changed)) Multi_wikis_changed(); else if (ctx.Match(k, Xoapi_search.Evt_multi_sorts_changed)) Multi_sorts_changed(); @@ -100,12 +106,15 @@ 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"); + private static final byte[] Qarg__fulltext = Bry_.new_a7("fulltext"), Qarg__fulltext__y = Bry_.new_a7("y"); private static Xow_domain_itm[] Get_by_crt(gplx.xowa.wikis.xwikis.Xow_xwiki_mgr xwiki_mgr, Xow_domain_itm cur, gplx.xowa.wikis.domains.crts.Xow_domain_crt_itm crt) { List_adp rv = List_adp_.new_(); int len = xwiki_mgr.Len(); for (int i = 0; i < len; ++i) { - gplx.xowa.wikis.xwikis.Xow_xwiki_itm xwiki = xwiki_mgr.Get_at(i); if (!xwiki.Offline()) continue; + gplx.xowa.wikis.xwikis.Xow_xwiki_itm xwiki = xwiki_mgr.Get_at(i); + if ( !xwiki.Offline() // note that filters are broad (*.wiktionary); skip offline wikis which won't be available on system + && xwiki.Domain_tid() != Xow_domain_tid_.Int__home) // note that home is marked "offline" so it won't show up in wikis sidebar + continue; Xow_domain_itm domain_itm = Xow_domain_itm_.parse(xwiki.Domain_bry()); if (crt.Matches(cur, domain_itm)) rv.Add(domain_itm); } diff --git a/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher.java new file mode 100644 index 000000000..322de893f --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher.java @@ -0,0 +1,53 @@ +/* +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.addons.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; +import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.specials.htmls.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_special_searcher { + private final Xoae_wiki_mgr wiki_mgr; + private final Ordered_hash cancel_hash = Ordered_hash_.New_bry(); + private final Srch_html_page_bldr html_page_bldr = new Srch_html_page_bldr(); + public Srch_special_searcher(Xoae_wiki_mgr wiki_mgr) {this.wiki_mgr = wiki_mgr;} + public void Search(Xow_wiki search_wiki, Xoae_page page, boolean search_is_async, Xow_domain_itm[] domains_ary, Srch_search_qry qry) { + Bry_bfr tmp_bfr = Bry_bfr.new_(); + html_page_bldr.Init_by_wiki(search_wiki, search_wiki.Lang().Num_mgr(), qry); + int domains_len = domains_ary.length; + for (int i = 0; i < domains_len; ++i) { + Xow_domain_itm domain = domains_ary[i]; + try { + Xowe_wiki wiki = wiki_mgr.Get_by_or_make(domain.Domain_bry()); wiki.Init_assert(); + byte[] key = gplx.langs.htmls.Gfh_utl.Encode_id_as_bry(Bry_.Add(qry.Phrase.Orig, Byte_ascii.Pipe_bry, qry.Ns_mgr.To_hash_key(), Byte_ascii.Pipe_bry, wiki.Domain_bry())); + Srch_special_cmd cmd = new Srch_special_cmd(this, qry, wiki, page.Tab_data().Close_mgr(), page.Tab_data().Tab().Html_itm(), key, search_is_async); + cancel_hash.Add(key, cmd); + cmd.Search(); // do search; note if async, will return immediately + html_page_bldr.Bld_tbl(tmp_bfr, new Srch_rslt_list(), key, cmd.wiki.Domain_bry(), search_is_async, qry.Slab_bgn, qry.Slab_end); + } catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "search:wiki failed; wiki=~{0} err=~{1}", domain.Domain_str(), Err_.Message_lang(e));} // handle bad wikis, like "en.wikipedia.org-old"; DATE:2015-04-24 + } + + // generate html; note if async, this will just generate the page header + page.Data_raw_(html_page_bldr.Bld_page(tmp_bfr.To_bry_and_clear())); + } + public void Search__done(Srch_special_cmd cmd) { + cancel_hash.Del(cmd.key); + } + public void Search__cancel(byte[] cmd_key) { + Srch_special_cmd cmd = (Srch_special_cmd)cancel_hash.Get_by(cmd_key); // if (cmd == null) return; // ignore false calls to cancel + cmd.On_cancel(); + cancel_hash.Del(cmd.key); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher_tst.java similarity index 84% rename from 400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java rename to 400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher_tst.java index be91a82e4..6c8b3ca78 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Srch_special_searcher_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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; -public class Xosrh_core_tst { +//namespace gplx.xowa.addons.searchs.v1s { +// import org.junit.*; using gplx.xowa.wikis.tdbs; using gplx.xowa.wikis.data.tbls; +// public class Xosrh_core_tst { // @Before public void Init() {fxt.Clear();} private Xos_search_mgr_fxt fxt = new Xos_search_mgr_fxt(); - @Test public void Basic() { +// @Test public void Basic() { // fxt.Init_basic(); // fxt.Test_search_exact("b2", "B2_22", "B2_12", "B2__2"); // fxt.Test_search_exact("a" , "A___0"); @@ -27,7 +27,7 @@ public class Xosrh_core_tst { // fxt.Test_search_exact("d"); // missing: end // fxt.Test_search_exact("$"); // missing: bgn // fxt.Test_search_match_bgn("b*", "B3_23", "B2_22", "B1_21", "B3_13", "B2_12", "B1_11", "B3__3", "B2__2", "B1__1"); - } +// } // @Test public void Page_size() { // fxt.Init_basic(); // fxt.Search_mgr().Page_mgr().Itms_per_page_(1); @@ -37,9 +37,9 @@ public class Xosrh_core_tst { // fxt.Test_search("b*", 3, "B3_13"); // } // @Test public void Url() { -// Xoa_url url = Xoa_url_parser_old.Parse_url(fxt.App(), fxt.Wiki(), "Special:Search/Abc?fulltext=y&xowa_sort=len_desc"); +// Xoa_url url = Xow_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()); +// Tfds.Eq(Srch_rslt_row_sorter.Tid_len_dsc, fxt.Search_mgr().Args_mgr().Sort_tid()); // } // @Test public void Url_arg_title() {// http://en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes&title=Mars // fxt.Test_url_search_bry("Special:Search?fulltext=y&search=Abc" , "Abc"); // query arg @@ -77,25 +77,25 @@ public class Xosrh_core_tst { //// @Test public void Page_next() { //// fxt.Init_basic(); //// fxt.Search_mgr().Page_size_(1); -//// fxt.Test_search(Xows_page__search.Match_tid_all, "B1", 0, "B1 1"); -//// fxt.Test_search(Xows_page__search.Match_tid_all, "B1", 1, "B1 11"); +//// fxt.Test_search(Srch_special_page.Match_tid_all, "B1", 0, "B1 1"); +//// fxt.Test_search(Srch_special_page.Match_tid_all, "B1", 1, "B1 11"); //// } //// @Test public void Misc_url() { //// fxt.Init_basic(); //// fxt.Search_mgr().Page_size_(1); //// fxt.Expd_address_page_("Special:Search/B1"); -//// fxt.Test_search(Xows_page__search.Match_tid_all, "B1", 0, "B1 1"); +//// fxt.Test_search(Srch_special_page.Match_tid_all, "B1", 0, "B1 1"); //// } // @Test public void Sort_defaults_to_len_desc() { // fxt.Init_basic(); // fxt.Search_mgr().Page_mgr().Itms_per_page_(3); -// fxt.Test_search2(Xows_page__search.Match_tid_bgn, "b" , 0, Xosrh_rslt_itm_sorter.Tid_ttl_asc , "B1_11", "B1_21", "B1__1"); // sort by name; note that _ sorts after alphabet -// fxt.Test_search2(Xows_page__search.Match_tid_bgn, "b" , 1, Xosrh_rslt_itm_sorter.Tid_none , "B2_12", "B2_22", "B2__2"); // sort by name still; next page should not reset -// fxt.Test_search2(Xows_page__search.Match_tid_bgn, "b2" , 0, Xosrh_rslt_itm_sorter.Tid_none , "B2_22", "B2_12", "B2__2"); // sort by len desc; new search should reset +// fxt.Test_search2(Srch_special_page.Match_tid_bgn, "b" , 0, Srch_rslt_row_sorter.Tid_ttl_asc , "B1_11", "B1_21", "B1__1"); // sort by name; note that _ sorts after alphabet +// fxt.Test_search2(Srch_special_page.Match_tid_bgn, "b" , 1, Srch_rslt_row_sorter.Tid_none , "B2_12", "B2_22", "B2__2"); // sort by name still; next page should not reset +// fxt.Test_search2(Srch_special_page.Match_tid_bgn, "b2" , 0, Srch_rslt_row_sorter.Tid_none , "B2_22", "B2_12", "B2__2"); // sort by len desc; new search should reset // } -} +// } // class Xos_search_mgr_fxt { -// Xoae_app app; Xowe_wiki wiki; Bry_bfr bfr = Bry_bfr.reset_(500); Xows_page__search search_mgr; +// Xoae_app app; Xowe_wiki wiki; Bry_bfr bfr = Bry_bfr.reset_(500); Srch_special_page search_mgr; // public Xoae_app App() {return app;} // public Xowe_wiki Wiki() {return wiki;} // public Xobl_regy_itm regy_itm_(int id, String bgn, String end, int count) {return new Xobl_regy_itm(id, Bry_.new_u8(bgn), Bry_.new_u8(end), count);} @@ -160,19 +160,19 @@ public class Xosrh_core_tst { // } // public void Clear() { // Io_mgr.Instance.InitEngine_mem(); -// app = Xoa_app_fxt.app_(); -// wiki = Xoa_app_fxt.wiki_tst_(app); +// app = Xoa_app_fxt.Make__app__edit(); +// wiki = Xoa_app_fxt.Make__wiki__edit(app); // search_mgr = wiki.Special_mgr().Page_search(); // wiki.Appe().Gui_mgr().Search_suggest_mgr().Args_default_str_("ns*=1"); // WORKAROUND: xdat fmt does not store ns with search data; pages will be retrieved with ns_id = null; force ns_all (instead of allowing ns_main default); // } -// public Xows_page__search Search_mgr() {return search_mgr;} +// public Srch_special_page Search_mgr() {return search_mgr;} // public void Test_url_search_bry(String url_str, String expd) { -// Xoa_url url = Xoa_url_parser_old.Parse_url(app, wiki, url_str); +// Xoa_url url = Xow_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_old.Parse_url(app, wiki, url_str); +// Xoa_url url = Xow_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,8 +197,8 @@ 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_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); +// Xow_url_parser_old url_parser = new Xow_url_parser_old(); +// byte[] url_raw = Bry_.new_a7("Special:Search/" + ttl_str + ((match_tid == Srch_special_page.Match_tid_all) ? "" : "*") + "?fulltext=y" + Srch_rslt_row_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); // Xoae_page page = wiki.Ctx().Page(); @@ -220,3 +220,4 @@ public class Xosrh_core_tst { // interface Xobl_data_itm { // void Srl_save(Bry_bfr bfr); // } +//} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_domain_sorter__manual_tid.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/Xow_domain_sorter__manual.java similarity index 94% rename from 400_xowa/src/gplx/xowa/specials/search/Xow_domain_sorter__manual_tid.java rename to 400_xowa/src/gplx/xowa/addons/searchs/specials/Xow_domain_sorter__manual.java index b9f53ec25..e4cd6c78b 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xow_domain_sorter__manual_tid.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/Xow_domain_sorter__manual.java @@ -15,10 +15,10 @@ 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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +package gplx.xowa.addons.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.core.primitives.*; import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; -class Xow_domain_sorter__manual implements gplx.core.lists.ComparerAble { +public class Xow_domain_sorter__manual implements gplx.core.lists.ComparerAble { private final Xow_domain_itm cur_domain; private final Xow_domain_crt_itm[] ary; private final int ary_len; public Xow_domain_sorter__manual(Xow_domain_itm cur_domain, Xow_domain_crt_itm[] ary) { @@ -118,4 +118,4 @@ class Xow_domain_sorter__manual_lang implements gplx.core.lists.ComparerAble { } return new Xow_domain_sorter__manual_lang(id_ints); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr.java new file mode 100644 index 000000000..08157a2d8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr.java @@ -0,0 +1,98 @@ +/* +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.addons.searchs.specials.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.specials.*; +import gplx.core.brys.fmtrs.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*; +import gplx.xowa.addons.searchs.specials.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_html_page_bldr { + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private Srch_search_qry qry; private Xow_wiki wiki; private Xol_num_mgr num_mgr; + private int slab_idx; + private Xoh_lnki_bldr lnki_bldr; private Xoh_anchor_kv_bldr self_lnkr = new Xoh_anchor_kv_bldr(); private Srch_html_row_bldr html_row_bldr; + public void Init_by_wiki(Xow_wiki wiki, Xol_num_mgr num_mgr, Srch_search_qry qry) { + this.wiki = wiki; this.num_mgr = num_mgr; this.qry = qry; + this.lnki_bldr = wiki.App().Html__lnki_bldr(); + int slab_len = qry.Slab_end - qry.Slab_bgn; + this.slab_idx = qry.Slab_bgn / slab_len; + this.html_row_bldr = new Srch_html_row_bldr(lnki_bldr); + self_lnkr.Init_w_qarg(tmp_bfr.Add(Bry__special_search).Add(qry.Phrase.Orig).Add(Bry__fulltext).To_bry_and_clear()); + } + public byte[] Bld_page(byte[] html_tbls_bry) { + byte[] rslts_hdr = fmtr_rslts.Bld_bry_many(tmp_bfr, num_mgr.Format_num(qry.Slab_bgn + List_adp_.Base1), num_mgr.Format_num(qry.Slab_end), qry.Phrase.Orig); + byte[] option_link = lnki_bldr.Href_(Bry_.new_a7("home"), wiki.Ttl_parse(Bry_.new_a7("Options/Search"))).Img_16x16(Xoh_img_path.Img_option).Bld_to_bry(); // HOME + fmtr_page.Bld_bfr_many(tmp_bfr, rslts_hdr, option_link, Bld_paging_link(Bool_.N), Bld_paging_link(Bool_.Y), html_tbls_bry); + return tmp_bfr.To_bry_and_clear(); + } + public void Bld_tbl(Bry_bfr bfr, Srch_rslt_list rslt_list, byte[] cmd_key, byte[] wiki_domain, boolean searching_db, int slab_bgn, int slab_end) { + html_row_bldr.Init(rslt_list, slab_bgn, slab_end); + byte[] search_link = lnki_bldr.Href_(wiki_domain, wiki.Ttl_parse(self_lnkr.Bld_to_bry())).Caption_(wiki_domain).Img_16x16(Xoh_img_path.Img_search).Img_pos_is_left_(Bool_.Y).Bld_to_bry(); + fmtr_tbl.Bld_bfr_many(bfr, search_link, searching_db ? Bld_cancel_link(wiki_domain, cmd_key) : Bry_.Empty, Bry_hdr_len, Bry_hdr_ttl, Srch_html_row_wkr.Gen_insert_key(wiki_domain), html_row_bldr); + } + private byte[] Bld_cancel_link(byte[] domain, byte[] cmd_key) { + lnki_bldr.Id_(Bry_.Add(Bry_.new_a7("xowa_cancel_"), domain)); + lnki_bldr.Href_(wiki, self_lnkr.Add_int(Srch_qarg_mgr.Bry__slab_idx, slab_idx).Add_bry(Srch_qarg_mgr.Bry__cancel, cmd_key).Bld_to_bry()); + lnki_bldr.Title_(Bry_cancel); + lnki_bldr.Img_16x16(Xoh_img_path.Img_cancel); + return lnki_bldr.Bld_to_bry(); + } + public byte[] Bld_paging_link(boolean fwd) { + byte[] title = null, img_path = Bry_.Empty; + boolean img_pos_is_left = true; + int qarg_slab_idx = slab_idx; + if (fwd) { + ++qarg_slab_idx; + // if (slab_idx > qry.Page_max()) return Gfh_entity_.Nbsp_num_bry; + img_pos_is_left = false; + img_path = Xoh_img_path.Img_go_fwd; + title = Bry_paging_fwd; + } + else { + --qarg_slab_idx; + if (qarg_slab_idx < 0) return Gfh_entity_.Nbsp_num_bry; + img_path = Xoh_img_path.Img_go_bwd; + title = Bry_paging_bwd; + } + return lnki_bldr.Title_(title).Href_(wiki, self_lnkr.Add_int(Srch_qarg_mgr.Bry__slab_idx, qarg_slab_idx).Bld_to_bry()).Img_16x16(img_path).Img_pos_is_left_(img_pos_is_left).Caption_(title).Bld_to_bry(); + } + private static final Bry_fmtr fmtr_page = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "~{rslts_hdr}~{option_link}" + , "
~{bwd_a}~{fwd_a}
~{tbls}" + , "
~{bwd_a}~{fwd_a}
" + ), "rslts_hdr", "option_link", "bwd_a", "fwd_a", "tbls"); + private static final Bry_fmtr fmtr_tbl = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , " " + , " " + , " ~{rows}" + , " " + , " " + , "
~{wiki}~{cancel}" + , "
~{hdr_len}" + , " ~{hdr_ttl}" + , "
" + ), "wiki", "cancel", "hdr_len", "hdr_ttl", "insert_key", "rows"); + private static final Bry_fmtr fmtr_rslts = Bry_fmtr.new_("Results ~{bgn} of ~{end} for ~{raw}", "bgn", "end", "raw"); + private static final byte[] Bry_paging_fwd = Bry_.new_a7("Next"), Bry_paging_bwd = Bry_.new_a7("Previous"), Bry_cancel = Bry_.new_a7("Stop searching") + , Bry_hdr_len = Bry_.new_a7("Page score"), Bry_hdr_ttl = Bry_.new_a7("Page title") + ; + private final byte[] Bry__special_search = Bry_.new_a7("Special:Search/"), Bry__fulltext = Bry_.new_a7("?fulltext=y"); +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr_tst.java similarity index 55% rename from 400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java rename to 400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr_tst.java index cb426250b..d268c01e1 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_page_bldr_tst.java @@ -15,12 +15,13 @@ 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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +package gplx.xowa.addons.searchs.specials.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.specials.*; import org.junit.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.data.tbls.*; -public class Xows_html_wkr_tst { - @Before public void init() {fxt.Clear();} private Xows_html_wkr_fxt fxt = new Xows_html_wkr_fxt(); +import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_html_page_bldr_tst { + @Before public void init() {fxt.Clear();} private Srch_html_page_bldr_fxt fxt = new Srch_html_page_bldr_fxt(); @Test public void Paging() { fxt.Test_paging(Bool_.Y, 1, "Next"); fxt.Test_paging(Bool_.N, 1, "Previous"); @@ -28,15 +29,15 @@ public class Xows_html_wkr_tst { fxt.Test_paging(Bool_.N, 0, " "); } @Test public void Rows() { - fxt.Test_rows(new Srch_rslt_itm[] {fxt.Make_row(10, "A"), fxt.Make_row(20, "B")}, String_.Concat_lines_nl_skip_last + fxt.Test_rows(new Srch_rslt_row[] {fxt.Make_row(10, "A"), fxt.Make_row(20, "B")}, String_.Concat_lines_nl_skip_last ( "" - , " " + , " " , " 10" , " " , " A" , " " , " " - , " " + , " " , " 20" , " " , " B" @@ -45,34 +46,40 @@ public class Xows_html_wkr_tst { )); } } -class Xows_html_wkr_fxt { - private Xoae_app app; private Xowe_wiki wiki; private Xows_html_wkr html_mgr; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); - public Xows_html_wkr_fxt Clear() { +class Srch_html_page_bldr_fxt { + private Xoae_app app; private Xowe_wiki wiki; private Srch_html_page_bldr html_mgr; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private int page_id; + public Srch_html_page_bldr_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); - html_mgr = new Xows_html_wkr(); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); + html_mgr = new Srch_html_page_bldr(); } + page_id = 0; return this; } - public void Test_paging(boolean fwd, int paging_idx, String expd) { - Srch_qry qry = new Srch_qry(Bry_.new_a7("A"), paging_idx, 100, new Xows_ns_mgr(), true, new Xow_domain_itm[] {Xow_domain_itm_.parse(wiki.Domain_bry())}); - qry.page_max = 2; + public void Test_paging(boolean fwd, int slab_idx, String expd) { + byte[] search_orig = Bry_.new_a7("A"); + Srch_search_qry qry = Srch_search_qry.New__search_page(Xow_domain_itm_.Ary_empty, wiki, app.Gui_mgr().Search_cfg(), Bool_.N, search_orig, slab_idx, 100); html_mgr.Init_by_wiki(wiki, wiki.Lang().Num_mgr(), qry); - byte[] paging_link = html_mgr.Paging_link(fwd); + byte[] paging_link = html_mgr.Bld_paging_link(fwd); Tfds.Eq(expd, String_.new_a7(paging_link)); } - public void Test_rows(Srch_rslt_itm[] rows, String expd) { - Srch_rslt_list rslt = new Srch_rslt_list(); - Xows_html_row html_row = new Xows_html_row(wiki.App().Html__lnki_bldr()); - html_row.Init(rslt); + public void Test_rows(Srch_rslt_row[] rows, String expd) { + Srch_rslt_list rslts = new Srch_rslt_list(); + Srch_html_row_bldr row_bldr = new Srch_html_row_bldr(wiki.App().Html__lnki_bldr()); + row_bldr.Init(rslts, 0, rows.length); for (int i = 0; i < rows.length; ++i) - rslt.Add(rows[i]); - html_row.Bfr_arg__add(tmp_bfr); + rslts.Add(rows[i]); + row_bldr.Bfr_arg__add(tmp_bfr); Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_clear()); } - public Srch_rslt_itm Make_row(int len, String ttl_str) { + public Srch_rslt_row Make_row(int len, String ttl_str) { + byte[] wiki_bry = Bry_.new_a7("w"); byte[] ttl_bry = Bry_.new_u8(ttl_str); - return new Srch_rslt_itm(Bry_.new_a7("w"), wiki.Ttl_parse(ttl_bry), 1, len); + ++page_id; + Srch_rslt_row rv = new Srch_rslt_row(Srch_rslt_row.Bld_key(wiki_bry, page_id), wiki_bry, wiki.Ttl_parse(ttl_bry), gplx.xowa.wikis.nss.Xow_ns_.Tid__main, ttl_bry, page_id, len, len, Srch_rslt_row.Page_redirect_id_null); + rv.Page_ttl_highlight = rv.Page_ttl.Full_txt_w_ttl_case(); + return rv; } } diff --git a/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_row_bldr.java b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_row_bldr.java new file mode 100644 index 000000000..5996331fb --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/searchs/specials/htmls/Srch_html_row_bldr.java @@ -0,0 +1,52 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.searchs.specials.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.specials.*; +import gplx.xowa.htmls.core.htmls.utls.*; import gplx.langs.htmls.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; +public class Srch_html_row_bldr implements gplx.core.brys.Bfr_arg { + private final Xoh_lnki_bldr lnki_bldr; + private Srch_rslt_list rslt_list; private int slab_bgn, slab_end; + private final Object thread_lock = new Object(); + public Srch_html_row_bldr(Xoh_lnki_bldr lnki_bldr) {this.lnki_bldr = lnki_bldr;} + public Srch_html_row_bldr Init(Srch_rslt_list rslt_list, int slab_bgn, int slab_end) {this.rslt_list = rslt_list; this.slab_bgn = slab_bgn; this.slab_end = slab_end; return this;} + public void Bfr_arg__add(Bry_bfr bfr) { // A + int rslts_len = rslt_list.Len(); + for (int i = slab_bgn; i < slab_end; ++i) { + if (i >= rslts_len) return; + Srch_rslt_row row = rslt_list.Get_at(i); + Bld_html(bfr, row); + } + } + public void Bld_html(Bry_bfr bfr, Srch_rslt_row row) { + synchronized (thread_lock) { + lnki_bldr.Href_(row.Wiki_bry, row.Page_ttl); + lnki_bldr.Title_(row.Page_ttl.Full_txt_w_ttl_case()); + lnki_bldr.Caption_direct_(row.Page_ttl_display(Bool_.Y)); + fmtr.Bld_many(bfr, Gfh_utl.Encode_id_as_str(row.Key), row.Page_score, lnki_bldr.Bld_to_bry()); + } + } + public Bry_fmt Fmtr() {return fmtr;} private final Bry_fmt fmtr = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " ~{page_len}" + , " " + , " ~{lnki}" // SERVER:" 1)" + ), tbl_name, score_max_as_str, count_as_str)); + conn.Exec_sql(Bry_fmt.Make_str(String_.Concat_lines_nl_skip_last + ( "UPDATE ~{tbl}" + , "SET row_score = (SELECT row_score FROM ~{tbl}_avg t2 WHERE t2.row_val = ~{tbl}.row_val)" + , "WHERE row_val IN (SELECT row_val FROM ~{tbl}_avg t2)" + ), tbl_name)); + conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "row_score", "row_key", "row_score")); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__db_rel_url_)) db_rel_url = m.ReadStr("v"); + else if (ctx.Match(k, Invk__select_sql_)) select_sql = m.ReadStr("v"); + else if (ctx.Match(k, Invk__tbl_name_)) tbl_name = m.ReadStr("v"); + else if (ctx.Match(k, Invk__score_max_)) score_max = m.ReadInt("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String Invk__db_rel_url_ = "db_rel_url_", Invk__select_sql_ = "select_sql_", Invk__tbl_name_ = "tbl_name_", Invk__score_max_ = "score_max_"; +} diff --git a/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Statistic_calculator.java b/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Statistic_calculator.java new file mode 100644 index 000000000..ca5e36d52 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Statistic_calculator.java @@ -0,0 +1,41 @@ +/* +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.addons.sqlite_utils.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.sqlite_utils.*; +class Statistic_calculator { + private int count; + private double old_avg, cur_avg, old_sum, cur_sum; + public int Count() {return count;} + public double Avg() {return (count > 0) ? cur_avg : 0;} + public double Variance() {return (count > 1) ? cur_sum / (count - 1) : 0;} + public double Stddev() {return Math_.Sqrt(Variance());} + public void Clear() {count = 0;} + public void Push(double x) { + count++; + if (count == 1) { + old_avg = cur_avg = x; + old_sum = 0.0; + } + else { + cur_avg = old_avg + ((x - old_avg) / count); + cur_sum = old_sum + ((x - old_avg) * (x - cur_avg)); + + old_avg = cur_avg; + old_sum = cur_sum; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Str_ary_.java b/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Str_ary_.java new file mode 100644 index 000000000..dc080a0f3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/sqlite_utils/bldrs/Str_ary_.java @@ -0,0 +1,35 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.sqlite_utils.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.sqlite_utils.*; +class Str_ary_ { + public static String[][] To_str_ary_ary(String v, String val_dlm, String row_dlm) {// "a|b|c`" + String[] rows_ary = String_.Split(v, row_dlm); + int rv_len = rows_ary.length; + String[][] rv = new String[rv_len][]; + for (int i = 0; i < rv_len; ++i) { + String row = rows_ary[i]; + String[] vals_ary = String_.Split(row, val_dlm); + int vals_len = vals_ary.length; + String[] rv_row = new String[vals_len]; + rv[i] = rv_row; + for (int j = 0; j < vals_len; ++j) + rv[i][j] = vals_ary[j]; + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_app_eval_tst.java b/400_xowa/src/gplx/xowa/apps/Xoa_app_eval_tst.java index c4d5ee301..a667128bb 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_app_eval_tst.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_app_eval_tst.java @@ -29,7 +29,7 @@ public class Xoa_app_eval_tst { class Xoa_app_eval_fxt { public void Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); fmtr = Bry_fmtr.new_(); eval = new Xoa_app_eval(); fmtr.Eval_mgr_(eval); diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_sys_cfg.java b/400_xowa/src/gplx/xowa/apps/Xoa_sys_cfg.java index 62fad5b9f..48cc17eb9 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_sys_cfg.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_sys_cfg.java @@ -31,7 +31,7 @@ public class Xoa_sys_cfg implements GfoInvkAble { return this; } private byte[] lang_key = Xol_lang_itm_.Key_en; public int Options_version() {return options_version;} public Xoa_sys_cfg Options_version_(int v) {options_version = v; return this;} private int options_version = 1; - public KeyVal[] Options_lang_list() {if (options_lang_list == null) options_lang_list = Options_list_lang_.new_(); return options_lang_list;} private KeyVal[] options_lang_list; + public Keyval[] Options_lang_list() {if (options_lang_list == null) options_lang_list = Options_list_lang_.new_(); return options_lang_list;} private Keyval[] options_lang_list; public long Free_mem_when() {return free_mem_when;} long free_mem_when; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_version)) return Xoa_app_.Version; @@ -49,7 +49,7 @@ public class Xoa_sys_cfg implements GfoInvkAble { , Invk_lang = "lang", Invk_lang_ = "lang_", Invk_lang_list = "lang_list"; } class Options_list_lang_ { - public static KeyVal[] new_() { + public static Keyval[] new_() { Ordered_hash translated = Ordered_hash_.New_bry(); List_adp untranslated = List_adp_.new_(); Add_itm_many(translated, Xol_lang_stub_.Id_en, Xol_lang_stub_.Id_de, Xol_lang_stub_.Id_pl, Xol_lang_stub_.Id_zh_hans, Xol_lang_stub_.Id_zh_hant); // add langs with translations first, so they alphabetize to top of list @@ -61,7 +61,7 @@ class Options_list_lang_ { } untranslated.Sort_by(Xol_lang_stub_.Comparer_key); - KeyVal[] rv = new KeyVal[len]; + Keyval[] rv = new Keyval[len]; int translated_max = translated.Count(); for (int i = 0; i < translated_max; i++) rv[i] = new_itm((Xol_lang_stub)translated.Get_at(i)); @@ -70,10 +70,10 @@ class Options_list_lang_ { rv[i] = new_itm((Xol_lang_stub)untranslated.Get_at(i - translated_max)); return rv; } - private static KeyVal new_itm(Xol_lang_stub itm) { + private static Keyval new_itm(Xol_lang_stub itm) { String key_str = String_.new_u8(itm.Key()); String name_str = String_.new_u8(itm.Canonical_name()); - return KeyVal_.new_(key_str, name_str + " [" + key_str + "]"); + return Keyval_.new_(key_str, name_str + " [" + key_str + "]"); } private static void Add_itm_many(Ordered_hash translated, int... langs) { int langs_len = langs.length; diff --git a/400_xowa/src/gplx/xowa/apps/Xoav_app.java b/400_xowa/src/gplx/xowa/apps/Xoav_app.java index 4b56e4afa..c171ccbd5 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoav_app.java +++ b/400_xowa/src/gplx/xowa/apps/Xoav_app.java @@ -74,7 +74,6 @@ public class Xoav_app implements Xoa_app, GfoInvkAble { public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();} public Json_parser Utl__json_parser() {return utl__json_parser;} private final Json_parser utl__json_parser = new Json_parser(); public boolean Bldr__running() {return bldr__running;} public void Bldr__running_(boolean v) {this.bldr__running = v;} private boolean bldr__running; - public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = Xop_amp_mgr.Instance; public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.U8(); // public Gfo_url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Gfo_url_encoder utl_encoder_fsys = Gfo_url_encoder.New_fsys_lnx(); diff --git a/400_xowa/src/gplx/xowa/apps/apis/Xoapi_doc.java b/400_xowa/src/gplx/xowa/apps/apis/Xoapi_doc.java index 649287722..42afd71d9 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/Xoapi_doc.java +++ b/400_xowa/src/gplx/xowa/apps/apis/Xoapi_doc.java @@ -50,10 +50,10 @@ xowa { gui { browser { url { - focus(); - exec_by_paste(); - exec_new_tab_by_paste(); - restore(); + focus(); + exec_by_paste(); + exec_new_tab_by_paste(); + restore(); exec(); } search { @@ -61,45 +61,45 @@ xowa { exec(); } tabs { - new_dflt__at_dflt__focus_y(); - new_link__at_dflt__focus_n(); - new_link__at_dflt__focus_y(); - new_href__at_dflt__focus_y(); - new_dupe__at_dflt__focus_y(); - close_cur(); - select_bwd(); - select_fwd(); - move_bwd(); - move_fwd(); - close_others(); - close_to_bgn(); - close_to_end(); - close_undo(); - pin_toggle(); - select_by_idx_1(); - select_by_idx_2(); - select_by_idx_3(); - select_by_idx_4(); - select_by_idx_5(); - select_by_idx_6(); - select_by_idx_7(); - select_by_idx_8(); + new_dflt__at_dflt__focus_y(); + new_link__at_dflt__focus_n(); + new_link__at_dflt__focus_y(); + new_href__at_dflt__focus_y(); + new_dupe__at_dflt__focus_y(); + close_cur(); + select_bwd(); + select_fwd(); + move_bwd(); + move_fwd(); + close_others(); + close_to_bgn(); + close_to_end(); + close_undo(); + pin_toggle(); + select_by_idx_1(); + select_by_idx_2(); + select_by_idx_3(); + select_by_idx_4(); + select_by_idx_5(); + select_by_idx_6(); + select_by_idx_7(); + select_by_idx_8(); select_by_idx_9(); } html { - focus(); - selection_focus_toggle(); + focus(); + selection_focus_toggle(); load_tid; // [mem,url] } find { - show(); - show_by_paste(); - hide(); - exec(); - type(); - find_bwd(); - find_fwd(); - case_toggle(); + show(); + show_by_paste(); + hide(); + exec(); + type(); + find_bwd(); + find_fwd(); + case_toggle(); wrap_toggle(); } prog { @@ -107,11 +107,11 @@ xowa { show_short_link; } info { - focus(); - clear(); - launch(); - warn_enabled; - note_enabled; + focus(); + clear(); + launch(); + warn_enabled; + note_enabled; } prog_log { show(); @@ -124,30 +124,30 @@ xowa { } page { edit { - copy(); - select_all(); - save(); - save_draft(); - preview(); - focus_edit_box(); - dbg_tmpl(); - dbg_html(); - exec(); - } - selection { - copy(); - select_all(); - save_file_as(); - } - view { - mode_read(); - mode_edit(); - mode_html(); - reload(); - refresh(); - print(); - save_as(); - } + copy(); + select_all(); + save(); + save_draft(); + preview(); + focus_edit_box(); + dbg_tmpl(); + dbg_html(); + exec(); + } + selection { + copy(); + select_all(); + save_file_as(); + } + view { + mode_read(); + mode_edit(); + mode_html(); + reload(); + refresh(); + print(); + save_as(); + } } } html { diff --git a/400_xowa/src/gplx/xowa/apps/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apps/apis/Xoapi_root.java index 9f259641c..b7f4763e4 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apps/apis/Xoapi_root.java @@ -40,16 +40,17 @@ public class Xoapi_root implements GfoInvkAble { html_api.Page().Toggle_mgr().Img_dir_(img_dir); usr_api.Init_by_app(app); } - public Xoapi_app App() {return app_api;} private final Xoapi_app app_api = new Xoapi_app(); - public Xoapi_nav Nav() {return nav_api;} private final Xoapi_nav nav_api = new Xoapi_nav(); - public Xoapi_gui Gui() {return gui_api;} private final Xoapi_gui gui_api = new Xoapi_gui(); - public Xoapi_html Html() {return html_api;} private final Xoapi_html html_api = new Xoapi_html(); - public Xoapi_bldr Bldr() {return bldr_api;} private final Xoapi_bldr bldr_api = new Xoapi_bldr(); - public Xoapi_net Net() {return net_api;} private final Xoapi_net net_api = new Xoapi_net(); - 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 Xoapi_addon Addon() {return addon_api;} private final Xoapi_addon addon_api = new Xoapi_addon(); + public Xoapi_app App() {return app_api;} private final Xoapi_app app_api = new Xoapi_app(); + public Xoapi_nav Nav() {return nav_api;} private final Xoapi_nav nav_api = new Xoapi_nav(); + public Xoapi_gui Gui() {return gui_api;} private final Xoapi_gui gui_api = new Xoapi_gui(); + public Xoapi_html Html() {return html_api;} private final Xoapi_html html_api = new Xoapi_html(); + public Xoapi_bldr Bldr() {return bldr_api;} private final Xoapi_bldr bldr_api = new Xoapi_bldr(); + public Xoapi_net Net() {return net_api;} private final Xoapi_net net_api = new Xoapi_net(); + 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); @@ -58,6 +59,7 @@ public class Xoapi_root implements GfoInvkAble { } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_app)) return app_api; + else if (ctx.Match(k, Invk_addon)) return addon_api; else if (ctx.Match(k, Invk_bldr)) return bldr_api; else if (ctx.Match(k, Invk_nav)) return nav_api; else if (ctx.Match(k, Invk_gui)) return gui_api; @@ -74,7 +76,8 @@ public class Xoapi_root implements GfoInvkAble { } private static final String 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_app = "app", Invk_addon = "addon" + , 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/apps/apis/xowa/Xoapi_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java new file mode 100644 index 000000000..befc0c863 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.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.apps.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; +import gplx.xowa.apps.apis.xowa.addons.*; +public class Xoapi_addon implements GfoInvkAble { + public void Ctor_by_app(Xoa_app app) {} + public Xoapi_search_addon Search() {return search;} private final Xoapi_search_addon search = new Xoapi_search_addon(); + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__search)) return search; + else return GfoInvkAble_.Rv_unhandled; + } + private static final String Invk__search = "search"; +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_search_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_search_addon.java new file mode 100644 index 000000000..4d1d79fd9 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_search_addon.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apps.apis.xowa.addons; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; +import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; +import gplx.xowa.apps.apis.xowa.addons.searchs.*; +public class Xoapi_search_addon implements GfoInvkAble { + public Xoapi_search_addon() {} + public Xoapi_url_bar Url_bar() {return url_bar;} private final Xoapi_url_bar url_bar = new Xoapi_url_bar(); + @gplx.Internal protected Xoapi_search_box Search_box() {return search_box;} private final Xoapi_search_box search_box = new Xoapi_search_box(); + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__url_bar)) return url_bar; + else if (ctx.Match(k, Invk__search_box)) return search_box; + else return GfoInvkAble_.Rv_unhandled; + } + private static final String + Invk__url_bar = "url_bar" + , Invk__search_box = "search_box" + ; +} +class Xoapi_search_box implements GfoInvkAble { + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + return null; + } +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_search_mode_.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_search_mode_.java new file mode 100644 index 000000000..e9c7e4794 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_search_mode_.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.apps.apis.xowa.addons.searchs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.addons.*; +public class Xoapi_search_mode_ { + public static final int Tid__title_full = 0, Tid__title_word = 1; + public static final String Str__title_full = "title.full", Str__title_word = "title.word"; + public static String To_str(int v) { + switch (v) { + case Tid__title_full: return Str__title_full; + case Tid__title_word: return Str__title_word; + default: throw Err_.new_unhandled_default(v); + } + } + public static int To_int(String v) { + if (String_.Eq(v, Str__title_full)) return Tid__title_full; + else if (String_.Eq(v, Str__title_word)) return Tid__title_word; + else throw Err_.new_unhandled_default(v); + } +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_url_bar.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_url_bar.java new file mode 100644 index 000000000..72c211426 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/searchs/Xoapi_url_bar.java @@ -0,0 +1,78 @@ +/* +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.apis.xowa.addons.searchs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.addons.*; +import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.crts.*; +public class Xoapi_url_bar implements GfoInvkAble, GfoEvMgrOwner { + public Xoapi_url_bar() { + this.evMgr = GfoEvMgr.new_(this); + } + public GfoEvMgr EvMgr() {return evMgr;} private final GfoEvMgr evMgr; + public boolean Enabled() {return enabled;} private boolean enabled = true; + public int Search_mode() {return search_mode;} private int search_mode = Xoapi_search_mode_.Tid__title_word; + public int Max_results() {return max_results;} private int max_results = 10; + public boolean Auto_wildcard() {return auto_wildcard;} private boolean auto_wildcard = true; + public Srch_ns_mgr Ns_mgr() {return ns_mgr;} private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr().Add_main_if_empty(); + public Srch_crt_scanner_syms Syms() {return syms;} private Srch_crt_scanner_syms syms = Srch_search_mgr.Scanner_syms; + public Keyval[] Operators() {return symbols;} private Keyval[] symbols = Keyval_.Ary_empty; + public int Visible_rows() {return visible_rows;} private int visible_rows = 10; + public int Jump_len() {return jump_len;} private int jump_len = 5; + private void Ns_ids_(String s) { + int[] ns_ids = Int_.Ary_empty; + if (String_.Eq(s, "*")) {} // leave as int[0]; ns_mgr will interpret as wildcard + else { + ns_ids = Int_.Ary_parse(s, ","); + } + ns_mgr.Add_by_int_ids(ns_ids); + GfoEvMgr_.Pub(this, Evt__ns_ids_changed); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__enabled)) return Yn.To_str(enabled); + else if (ctx.Match(k, Invk__enabled_)) enabled = m.ReadBool("v"); + else if (ctx.Match(k, Invk__search_mode)) return Xoapi_search_mode_.To_str(search_mode); + else if (ctx.Match(k, Invk__search_mode_)) search_mode = Xoapi_search_mode_.To_int(m.ReadStr("v")); + else if (ctx.Match(k, Invk__max_results)) return Int_.To_str(max_results); + else if (ctx.Match(k, Invk__max_results_)) max_results = m.ReadInt("v"); + else if (ctx.Match(k, Invk__auto_wildcard)) return Yn.To_str(auto_wildcard); + else if (ctx.Match(k, Invk__auto_wildcard_)) auto_wildcard = m.ReadBool("v"); + else if (ctx.Match(k, Invk__ns_ids)) return Int_.To_str(ns_mgr.To_int_ary(), "|"); + else if (ctx.Match(k, Invk__ns_ids_)) Ns_ids_(m.ReadStr("v")); + else if (ctx.Match(k, Invk__symbols)) return String_.new_u8(syms.To_bry()); + else if (ctx.Match(k, Invk__symbols_)) syms.Parse(m.ReadBry("v")); + else if (ctx.Match(k, Invk__visible_rows)) return Int_.To_str(visible_rows); + else if (ctx.Match(k, Invk__visible_rows_)) {visible_rows = m.ReadInt("v"); GfoEvMgr_.PubVal(this, Evt__visible_rows_changed, visible_rows);} + else if (ctx.Match(k, Invk__jump_len)) return Int_.To_str(jump_len); + else if (ctx.Match(k, Invk__jump_len_)) {jump_len = m.ReadInt("v"); GfoEvMgr_.PubVal(this, Evt__jump_len_changed, jump_len);} + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String + Invk__enabled = "enabled" , Invk__enabled_ = "enabled_" + , Invk__search_mode = "search_mode" , Invk__search_mode_ = "search_mode_" + , Invk__max_results = "max_results" , Invk__max_results_ = "max_results_" + , Invk__auto_wildcard = "auto_wildcard" , Invk__auto_wildcard_ = "auto_wildcard_" + , Invk__ns_ids = "ns_ids" , Invk__ns_ids_ = "ns_ids_" + , Invk__symbols = "symbols" , Invk__symbols_ = "symbols_" + , Invk__visible_rows = "visible_rows" , Invk__visible_rows_ = "visible_rows_" + , Invk__jump_len = "jump_len" , Invk__jump_len_ = "jump_len_" + ; + public static final String + Evt__visible_rows_changed = "visible_rows_changed" + , Evt__jump_len_changed = "jump_len_changed" + , Evt__ns_ids_changed = "ns_ids_changed" + ; +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java index 30909b346..7fd1a2dae 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java @@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.apps.apis.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.bldrs.*; -import gplx.core.ios.*; import gplx.xowa.wikis.data.*; +import gplx.core.ios.*; import gplx.xowa.wikis.data.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.page_ranks.*; public class Xoapi_import implements GfoInvkAble { + public Xoapi_page_rank Page_rank() {return page_rank;} private final Xoapi_page_rank page_rank = new Xoapi_page_rank(); public long Layout_all_max() {return layout_all_max;} private long layout_all_max = 0; // disable by default; may set to 200 MB in future public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB @@ -77,10 +78,11 @@ public class Xoapi_import implements GfoInvkAble { else if (ctx.Match(k, Invk_hzip_mode_is_b256_)) hzip_mode_is_b256 = m.ReadYn("v"); else if (ctx.Match(k, Invk_user_name)) return user_name; else if (ctx.Match(k, Invk_user_name_)) user_name = m.ReadStr("v"); + else if (ctx.Match(k, Invk_page_rank)) return page_rank; else return GfoInvkAble_.Rv_unhandled; return this; } - private static KeyVal[] Options_zip_tid__list = KeyVal_.Ary(KeyVal_.new_("raw", "text"), KeyVal_.new_("gzip"), KeyVal_.new_("bzip2")); + private static Keyval[] Options_zip_tid__list = Keyval_.Ary(Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2")); private static final String Invk_layout_all_max = "layout_all_max" , Invk_layout_all_max_ = "layout_all_max_" , Invk_layout_text_max = "layout_text_max" , Invk_layout_text_max_ = "layout_text_max_" @@ -96,6 +98,7 @@ public class Xoapi_import implements GfoInvkAble { , Invk_user_name = "user_name" , Invk_user_name_ = "user_name_" , Invk_hzip_enabled = "hzip_enabled" , Invk_hzip_enabled_ = "hzip_enabled_" , Invk_hzip_mode_is_b256 = "hzip_mode_is_b256" , Invk_hzip_mode_is_b256_ = "hzip_mode_is_b256_" + , Invk_page_rank = "page_rank" ; public static final byte[] Ns_file_map__each = Bry_.new_a7(""); } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/page_ranks/Xoapi_page_rank.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/page_ranks/Xoapi_page_rank.java new file mode 100644 index 000000000..03f99190b --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/page_ranks/Xoapi_page_rank.java @@ -0,0 +1,30 @@ +/* +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.apis.xowa.bldrs.imports.page_ranks; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.bldrs.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.*; +public class Xoapi_page_rank implements GfoInvkAble { + public int Iteration_max() {return iteration_max;} private int iteration_max = 0; + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_iteration_max)) return Int_.To_str(iteration_max); + else if (ctx.Match(k, Invk_iteration_max_)) iteration_max = m.ReadInt("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String + Invk_iteration_max = "iteration_max" , Invk_iteration_max_ = "iteration_max_" + ; +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/Xoapi_font.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/Xoapi_font.java index 62419139f..d6a70c9c6 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/Xoapi_font.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/Xoapi_font.java @@ -40,7 +40,7 @@ public class Xoapi_font implements GfoInvkAble { app.Gui_mgr().Win_cfg().Font().Size_(gui_font_size); app.Cfg_mgr().Set_by_app("app.gui.win_opts.font.size", Float_.To_str(gui_font_size)); app.Cfg_mgr().Db_save_txt(); - app.Gui_mgr().Browser_win().Page__reload(); // NOTE: force reload; needed if viewing Help:Options/HTML, else Font size won't update + app.Gui_mgr().Browser_win().Page__reload(); // NOTE: force reload; needed if viewing home/wiki/Options/HTML, else Font size won't update } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_increase)) this.Increase(); diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_find.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_find.java index 432254c1e..701ad8535 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_find.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_find.java @@ -40,7 +40,8 @@ public class Xoapi_find implements GfoInvkAble { } class Xog_find_box { private Xoae_app app; private Xog_win_itm win; private GfuiTextBox find_box; - private String prv_find_text; private boolean dir_fwd = true, case_match = false, wrap_search = true; + private String prv_find_text = ""; // NOTE: must set to "", else will fail during Hide + private boolean dir_fwd = true, case_match = false, wrap_search = true; public Xog_find_box(Xoae_app app) { this.app = app; this.win = app.Gui_mgr().Browser_win(); @@ -66,7 +67,7 @@ class Xog_find_box { win.Usr_dlg().Prog_direct("Find direction changed to " + (fwd ? "forward" : "backward")); } public void Exec() { - prv_find_text = find_box.Text(); + prv_find_text = find_box.Text(); Exec_find(prv_find_text, Bool_.Y); } private void Exec_find(String find, boolean highlight_matches) { diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url.java index 274126e04..2af2bc08e 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url.java @@ -18,9 +18,14 @@ along with this program. If not, see . package gplx.xowa.apps.apis.xowa.gui.browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.gui.*; import gplx.gfui.*; import gplx.xowa.guis.views.*; import gplx.core.envs.*; public class Xoapi_url implements GfoInvkAble { - public void Init_by_kit(Xoae_app app) {this.app = app;} private Xoae_app app; - private GfuiTextBox Url_box() {return app.Gui_mgr().Browser_win().Url_box();} - public void Focus() {this.Url_box().Focus_select_all();} + private Xoae_app app; + private Xoapi_url_searcher url_searcher; + public void Init_by_kit(Xoae_app app) { + this.app = app; + this.url_searcher = new Xoapi_url_searcher(app); + } + private GfuiComboBox Url_box() {return app.Gui_mgr().Browser_win().Url_box();} + public void Focus() {this.Url_box().Focus(); this.Url_box().Sel_(0, String_.Len(this.Url_box().Text()));} public void Exec() {Exec_wkr(Bool_.N, this.Url_box().Text());} public void Exec_by_paste() {Exec_wkr(Bool_.N, ClipboardAdp_.GetText());} public void Exec_new_tab_by_paste() {Exec_wkr(Bool_.Y, ClipboardAdp_.GetText());} @@ -28,15 +33,29 @@ public class Xoapi_url implements GfoInvkAble { 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().To_str()); } + public void Type() { + url_searcher.Search(); + } private void Exec_wkr(boolean new_tab, String urls_text) { if (Op_sys.Cur().Tid_is_wnt()) urls_text = String_.Replace(urls_text, Op_sys.Wnt.Nl_str(), Op_sys.Lnx.Nl_str()); String[] urls = String_.Split(String_.Trim(urls_text), Op_sys.Lnx.Nl_str()); int urls_len = urls.length; if (urls_len == 0) return; - if (urls_len == 1) { + if (urls_len == 1) { // 1 url; most cases String url = urls[0]; - this.Url_box().Text_(url); + gplx.core.threads.Thread_adp_.Sleep(1); // HACK: sleep 1 ms, else rapid keystrokes may cause last keystroke to not register; EX: typing "w:" may show just "w" instead of "w:"; DATE:2016-03-27 + GfuiComboBox combo = this.Url_box(); + String[] itms_ary = combo.DataSource_as_str_ary(); + if ( itms_ary.length > 0 // results exist... + && combo.List_visible()) { // and dropdown is visible; use selected-item + int sel_idx = combo.List_sel_idx(); // get selected item + if (sel_idx == -1) sel_idx = 0; // if nothing selected, default to 1st; allows typing first few characters and picking 1st item from list + String itms_sel = itms_ary[sel_idx]; + // if (String_.Has(String_.Lower(itms_sel), String_.Lower(url))) // make sure itms_sel contains url; handles slow machines, where dropdown may not be updated yet + url = Xog_win_itm.Remove_redirect_if_exists(itms_sel); + } + combo.Text_(url); app.Gui_mgr().Browser_win().Page__navigate_by_url_bar(url); } else { @@ -54,9 +73,10 @@ public class Xoapi_url implements GfoInvkAble { else if (ctx.Match(k, Invk_exec_by_paste)) this.Exec_by_paste(); else if (ctx.Match(k, Invk_exec_new_tab_by_paste)) this.Exec_new_tab_by_paste(); else if (ctx.Match(k, Invk_restore)) this.Restore(); + else if (ctx.Match(k, Invk_type)) this.Type(); else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_focus = "focus", Invk_exec_by_paste = "exec_by_paste", Invk_exec_new_tab_by_paste = "exec_new_tab_by_paste", Invk_restore = "restore"; + private static final String Invk_focus = "focus", Invk_exec_by_paste = "exec_by_paste", Invk_exec_new_tab_by_paste = "exec_new_tab_by_paste", Invk_restore = "restore", Invk_type = "type"; public static final String Invk_exec = "exec"; } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url_searcher.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url_searcher.java new file mode 100644 index 000000000..c6d1fcb35 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/browsers/Xoapi_url_searcher.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.apps.apis.xowa.gui.browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.gui.*; +import gplx.gfui.*; +import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; import gplx.xowa.addons.searchs.searchers.cbks.*; +import gplx.xowa.apps.apis.xowa.addons.searchs.*; +import gplx.xowa.guis.views.*; +class Xoapi_url_searcher implements GfoEvObj { + private final Xoae_app app; + private final Xoapi_url_bar url_bar_api; private Srch_search_addon addon; + private final GfuiComboBox url_bar; + public Xoapi_url_searcher(Xoae_app app) { // called by Init_by_kit + this.app = app; + this.evMgr = GfoEvMgr.new_(this); + this.url_bar = app.Gui_mgr().Browser_win().Url_box(); + this.url_bar_api = app.Api_root().Addon().Search().Url_bar(); + GfoEvMgr_.SubSame_many(url_bar_api, this, Xoapi_url_bar.Evt__jump_len_changed, Xoapi_url_bar.Evt__visible_rows_changed, Xoapi_url_bar.Evt__ns_ids_changed); + url_bar.Items__jump_len_(url_bar_api.Jump_len()); + url_bar.Items__visible_rows_(url_bar_api.Visible_rows()); + } + public GfoEvMgr EvMgr() {return evMgr;} private final GfoEvMgr evMgr; + public void Search() { + if (!url_bar_api.Enabled()) return; + Xog_tab_itm active_tab = app.Gui_mgr().Browser_win().Tab_mgr().Active_tab(); if (active_tab == null) return; + Xow_wiki wiki = active_tab.Wiki(); + + String search_str = url_bar.Text(); + url_bar.Text_fallback_(search_str); + // remove "en.wikipedia.org/wiki/" + // String url_bgn = wiki.Domain_str() + gplx.xowa.htmls.hrefs.Xoh_href_.Str__wiki; + // if (String_.Has_at_bgn(search_str, url_bgn)) + // search_str = String_.Mid(search_str, String_.Len(url_bgn)); + if (String_.Len_eq_0(search_str)) { + url_bar.Items__update(String_.Ary_empty); + return; + } + + if (addon == null) { + addon = Srch_search_addon.Get(wiki); + } + else { + if (!Bry_.Eq(wiki.Domain_bry(), addon.Wiki_domain())) // NOTE: url_bar_api caches addon at wiki level; need to check if wiki has changed + addon = Srch_search_addon.Get(wiki); + } + if (addon.Db_mgr().Cfg().Version_id__needs_upgrade()) return; // exit early, else will flash "searching" message below; note that url-bar should not trigger upgrade; + url_bar.List_sel_idx_(0); // clear selected list item; EX: search "a" -> page down; sel is row #5 -> search "b" -> sel should not be #5; DATE:2016-03-24 + if (!url_bar.List_visible()) url_bar.Items__size_to_fit(url_bar_api.Max_results()); // resize offscreen; handles 1st search when dropdown flashes briefly in middle of screen before being moved under bar; DATE:2016-03-24 + Srch_search_qry qry = Srch_search_qry.New__url_bar(wiki, url_bar_api, Bry_.new_u8(search_str)); + Srch_rslt_cbk__url_bar cbk = new Srch_rslt_cbk__url_bar(app, url_bar, url_bar_api); + Xoa_app_.Usr_dlg().Prog_one("", "", "searching (please wait): ~{0}", search_str); + addon.Search(qry, cbk); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Xoapi_url_bar.Evt__jump_len_changed)) {url_bar.Items__jump_len_(m.ReadInt("v"));} + else if (ctx.Match(k, Xoapi_url_bar.Evt__visible_rows_changed)) {url_bar.Items__visible_rows_(m.ReadInt("v"));} + else if (ctx.Match(k, Xoapi_url_bar.Evt__ns_ids_changed)) {if (addon != null) addon.Clear_rslts_cache();} // invalidate cache when ns changes; else ns_0 rslts will show up in ns_100; DATE:2016-03-24 + return this; + } +} diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/html/modules/Xoapi_popups.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/html/modules/Xoapi_popups.java index 4aabeef96..e96682613 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/html/modules/Xoapi_popups.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/html/modules/Xoapi_popups.java @@ -182,7 +182,7 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { , Evt_html_fmtr_wiki_changed = "html_fmtr_wiki_changed" , Evt_html_fmtr_next_sect_changed = "html_fmtr_next_sect_changed" ; - public static final byte[] + public static final byte[] Dflt_xnde_ignore_ids = Bry_.new_a7("coordinates") , Dflt_tmpl_keeplist = Bry_.new_a7("en.wikipedia.org|formatnum;age;age_in_days;age_in_years_and_days*;nts;number_table_sorting*;as_of;oldstyledatedy;gregorian_serial_date;currentminute;currentsecond;dmca;spaced_ndash;trim;month*;convert*;worldpop*;ipa*;lang*;nowrap*;h:*;mvar;math;vgy;audio;iso_639_name;transl;translate;linktext;zh;nihongo*;japanese_name;ko-hhrm;mp|\n") , Dflt_html_fmtr_popup = Bry_.new_a7(String_.Concat_lines_nl_skip_last @@ -204,7 +204,7 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { , " }'>" , " }'> " , " }'>" - , " }'>" + , " }'>" // HOME , " " , "" )) @@ -212,13 +212,13 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { , Dflt_html_fmtr_wiki = Bry_.new_a7("\n ~{<>msgs.get('api-xowa.html.modules.popups.msgs.wiki-name');<>}~{wiki_val}") , Dflt_html_fmtr_next_sect = Bry_.new_a7("\n\n~{<>msgs.get('api-xowa.html.modules.popups.msgs.next_sect-name');<>}~{next_sect_val}") ; - public static final String[] + public static final String[] Dflt_html_fmtr_popup_keys = String_.Ary("content", "page_lang_ltr", "page_url", "page_title", "popup_id", "wiki_item", "page_size", "edit_time", "view_time_item", "xowa_root_dir") , Dflt_html_fmtr_viewed_keys = String_.Ary("viewed_val") , Dflt_html_fmtr_wiki_keys = String_.Ary("wiki_val") , Dflt_html_fmtr_next_sect_keys = String_.Ary("next_sect_val") ; - public static final byte[] + public static final byte[] Dflt_ns_allowed = Bry_.Empty ; public static final int diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/specials/Xoapi_search.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/specials/Xoapi_search.java index f267b3afb..4118cfb4a 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/specials/Xoapi_search.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/specials/Xoapi_search.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.xowa.apps.apis.xowa.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; public class Xoapi_search implements GfoInvkAble, GfoEvMgrOwner { - private final Xow_domain_crt_kv_itm_mgr multi_wikis_mgr = new Xow_domain_crt_kv_itm_mgr(); private byte[] multi_wikis_bry = Dflt_multi_wikis_bry; - private final Xow_domain_crt_kv_itm_mgr multi_sorts_mgr = new Xow_domain_crt_kv_itm_mgr(); private byte[] multi_sorts_bry = Dflt_multi_sorts_bry; + private final Xow_domain_crt_kv_itm_mgr multi_wikis_mgr = new Xow_domain_crt_kv_itm_mgr(); private byte[] multi_wikis_bry = Dflt_multi_wikis_bry; + private final Xow_domain_crt_kv_itm_mgr multi_sorts_mgr = new Xow_domain_crt_kv_itm_mgr(); private byte[] multi_sorts_bry = Dflt_multi_sorts_bry; public Xoapi_search() { this.evMgr = GfoEvMgr.new_(this); multi_wikis_mgr.Parse_as_itms(multi_wikis_bry); multi_sorts_mgr.Parse_as_arys(multi_sorts_bry); } public GfoEvMgr EvMgr() {return evMgr;} private GfoEvMgr evMgr; - public int Results_per_page() {return results_per_page;} private int results_per_page = 20; + public int Results_per_page() {return results_per_page;} private int results_per_page = 100; public boolean Async_db() {return async_db;} private boolean async_db = true; public void Multi_wikis_bry_(byte[] v) { if (!multi_wikis_mgr.Parse_as_itms(v)) return; @@ -66,7 +66,7 @@ public class Xoapi_search implements GfoInvkAble, GfoEvMgrOwner { Evt_multi_wikis_changed = "multi_wikis_changed" , Evt_multi_sorts_changed = "multi_sorts_changed" ; - public static final byte[] + public static final byte[] Dflt_multi_wikis_bry = Bry_.new_a7("|") , Dflt_multi_sorts_bry = Bry_.new_a7("|,*.wikipedia,*.wikivoyage,*.wiktionary,*.wikisource,*.wikiquote,*.wikibooks,*.wikiversity,*.wikinews") ; diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java index 2e13cef20..263bf93fe 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java @@ -35,5 +35,5 @@ public class Xoapi_startup_tabs_tid_ { else if (String_.Eq(s, Key_custom)) return Tid_custom; else throw Err_.new_unimplemented(); } - public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_(Key_blank), KeyVal_.new_(Key_xowa), KeyVal_.new_(Key_previous), KeyVal_.new_(Key_custom)); + public static Keyval[] Options__list = Keyval_.Ary(Keyval_.new_(Key_blank), Keyval_.new_(Key_xowa), Keyval_.new_(Key_previous), Keyval_.new_(Key_custom)); } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/usrs/Xoapi_cache.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/usrs/Xoapi_cache.java index 261d66e6e..113948d9a 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/usrs/Xoapi_cache.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/usrs/Xoapi_cache.java @@ -23,10 +23,10 @@ public class Xoapi_cache implements GfoInvkAble { private String Info() { cache_mgr.Page_bgn(); Bry_bfr bfr = Bry_bfr.new_(255); - KeyVal[] ary = cache_mgr.Info(); + Keyval[] ary = cache_mgr.Info(); int len = ary.length; for (int i = 0; i < len; ++i) { - KeyVal kv = ary[i]; + Keyval kv = ary[i]; bfr.Add_str_a7(kv.Key()).Add_str_a7(": ").Add_str_u8(kv.Val_to_str_or_empty()).Add_byte_nl(); } return bfr.To_str_and_clear(); diff --git a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java index da5a6e839..50488cd8d 100644 --- a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java @@ -43,7 +43,7 @@ public class Xoa_cfg_mgr_tst { class Xoa_cfg_mgr_fxt { public void Clear() { // if (app == null) { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); cfg_mgr = app.Cfg_mgr(); // } } private Xoae_app app; Xoa_cfg_mgr cfg_mgr; diff --git a/400_xowa/src/gplx/xowa/apps/cfgs/old/Xocfg_tab_new_mgr.java b/400_xowa/src/gplx/xowa/apps/cfgs/old/Xocfg_tab_new_mgr.java index 4a5577c2f..06bb13389 100644 --- a/400_xowa/src/gplx/xowa/apps/cfgs/old/Xocfg_tab_new_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/cfgs/old/Xocfg_tab_new_mgr.java @@ -46,5 +46,5 @@ class Xocfg_new_tab_pos { default: throw Err_.new_unhandled(v); } } - public static KeyVal[] Options__all = KeyVal_.Ary(KeyVal_.new_(Key_all_bgn), KeyVal_.new_(Key_all_end), KeyVal_.new_(Key_cur_prv), KeyVal_.new_(Key_cur_nxt)); + public static Keyval[] Options__all = Keyval_.Ary(Keyval_.new_(Key_all_bgn), Keyval_.new_(Key_all_end), Keyval_.new_(Key_cur_prv), Keyval_.new_(Key_cur_nxt)); } diff --git a/400_xowa/src/gplx/xowa/apps/fmtrs/Xoa_fmtr_itm_tst.java b/400_xowa/src/gplx/xowa/apps/fmtrs/Xoa_fmtr_itm_tst.java index 06cd49607..be58cfcf1 100644 --- a/400_xowa/src/gplx/xowa/apps/fmtrs/Xoa_fmtr_itm_tst.java +++ b/400_xowa/src/gplx/xowa/apps/fmtrs/Xoa_fmtr_itm_tst.java @@ -28,8 +28,8 @@ public class Xoa_fmtr_itm_tst { class Xoa_fmtr_itm_fxt { private Xoae_app app; private Xoa_fmtr_itm itm; public void Clear() { - app = Xoa_app_fxt.app_(); - Xoa_app_fxt.wiki_tst_(app); // create enwiki + app = Xoa_app_fxt.Make__app__edit(); + Xoa_app_fxt.Make__wiki__edit(app); // create enwiki itm = new Xoa_fmtr_itm(app); GfsCore.Instance.MsgParser_(gplx.langs.gfs.Gfs_msg_bldr.Instance); } diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/File_retrieve_mode.java b/400_xowa/src/gplx/xowa/apps/servers/http/File_retrieve_mode.java index 4fe563a8c..6a3f15039 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/File_retrieve_mode.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/File_retrieve_mode.java @@ -32,5 +32,5 @@ class File_retrieve_mode { else throw Err_.new_unimplemented(); } public static final byte Mode_skip = 1, Mode_wait = 2, Mode_async_server = 3; - public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_("wait"), KeyVal_.new_("skip"), KeyVal_.new_("async_server", "async server")); + public static Keyval[] Options__list = Keyval_.Ary(Keyval_.new_("wait"), Keyval_.new_("skip"), Keyval_.new_("async_server", "async server")); } diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java index a601b00ab..84b6f1901 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java @@ -30,7 +30,7 @@ public class Http_server_wkr__tst { class Http_server_wkr__fxt { private Xoae_app app; public void Clear() { - this.app = Xoa_app_fxt.app_(); + this.app = Xoa_app_fxt.Make__app__edit(); } public void Init_wiki_main_page(String domain, String main_page) { Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_u8(domain)); diff --git a/400_xowa/src/gplx/xowa/apps/servers/tcp/Xosrv_server_tst.java b/400_xowa/src/gplx/xowa/apps/servers/tcp/Xosrv_server_tst.java index 7c8127487..834cdb268 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/tcp/Xosrv_server_tst.java +++ b/400_xowa/src/gplx/xowa/apps/servers/tcp/Xosrv_server_tst.java @@ -29,7 +29,7 @@ public class Xosrv_server_tst { } class Xosrv_server_fxt { public Xosrv_server_fxt Clear() { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); Xoa_app_fxt.Init_gui(app, null); // NOTE: null wiki does not matter for test return this; } private Xoae_app app; diff --git a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_mgr_tst.java b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_mgr_tst.java index 7ac3cdf51..4e3956c59 100644 --- a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_mgr_tst.java @@ -74,9 +74,9 @@ class Xoa_site_cfg_mgr_fxt { public Xoa_site_cfg_mgr_fxt() { // Xoa_app_.Usr_dlg_(Xoa_app_.usr_dlg_console_()); Xoa_test_.Inet__init(); - this.app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); - Xoa_test_.Db__init__mem(wiki); + this.app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); + Xoa_test_.Init__db__edit(wiki); this.cfg_tbl = wiki.Data__core_mgr().Tbl__cfg(); this.site_cfg_mgr = app.Site_cfg_mgr(); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__basic__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__basic__tst.java index e51c77a87..0019d3c39 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__basic__tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__basic__tst.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; public class Xoa_url__basic__tst { - private final Xoa_url_fxt fxt = new Xoa_url_fxt(); + private final Xoa_url_fxt fxt = new Xoa_url_fxt(); @Test public void Eq_page() { 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 extends Xoa_url_parser_fxt { public void Test_eq_page(boolean expd, String lhs_str, String rhs_str) { +class Xoa_url_fxt extends Xow_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/apps/urls/Xoa_url__to_str__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java index 0eb81583b..00dc03a3f 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java @@ -19,7 +19,7 @@ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa import org.junit.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.wikis.nss.*; public class Xoa_url__to_str__tst { - private final Xoa_url__to_str__fxt fxt = new Xoa_url__to_str__fxt(); + 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");} @@ -46,11 +46,11 @@ public class Xoa_url__to_str__tst { } @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(); +class Xoa_url__to_str__fxt extends Xow_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"); + private static final byte[] Bry__page = Bry_.new_a7("Page_1"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java similarity index 93% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java index 6792683e3..1666371ec 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java @@ -21,19 +21,19 @@ import gplx.xowa.htmls.hrefs.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.files.*; -public class Xoa_url_parser { - private final Gfo_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; +public class Xow_url_parser { + private final Gfo_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) { + private final Xol_vnt_mgr vnt_mgr; + public Xow_url_parser(Xow_wiki wiki) { this.app = wiki.App(); this.wiki = wiki; this.domain_bry = wiki.Domain_bry(); this.encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Xourl; @@ -53,6 +53,8 @@ public class Xoa_url_parser { Xow_wiki wiki_itm = app.Wiki_mgri().Get_by_or_make_init_y(wiki_bry); // NOTE: must call Init to load Main_Page; only call if from url_bar, else all sister wikis will be loaded when parsing Sister_wikis panel rv.Page_bry_(wiki_itm.Props().Main_page()); } + Xoa_ttl ttl = wiki.Ttl_parse(rv.Page_bry()); // parse to ttl to get proper casing; EX: "earth" -> "Earth" x> "earth"; DATE:2016-03-25 + rv.Page_bry_(ttl.Full_db()); return rv; } public Gfo_url_parser Url_parser() {return url_parser;} @@ -302,13 +304,13 @@ public class Xoa_url_parser { 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[] + 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_file = Bry_.new_a7("File:") // NOTE: File does not need i18n; is a canonical namespace , Bry_wiki = Bry_.new_a7("wiki") ; - public static final byte[] + public static final byte[] Bry_dot_org = Bry_.new_a7(".org") ; } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__proto_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java similarity index 93% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__proto_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java index e907d91b5..9d5e8e10d 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__proto_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__proto_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__proto_tst { + private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Relative() { tstr.Run_parse("//en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__qarg_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java similarity index 94% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__qarg_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java index ea928ef61..47ceff5b8 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__qarg_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__qarg_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__qarg_tst { + private final Xow_url_parser_fxt tstr = new Xow_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"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__ttl_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java similarity index 94% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__ttl_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java index 3cc19ebc0..dc325a5fc 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__ttl_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__ttl_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__ttl_tst { + private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Name() { tstr.Run_parse("A").Chk_wiki("en.wikipedia.org").Chk_page("A"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__url_bar_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java similarity index 84% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__url_bar_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java index 07e321ad7..19fe1ecad 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__url_bar_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java @@ -17,25 +17,25 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__url_bar_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__url_bar_tst { + private final Xow_url_parser_fxt tstr = new Xow_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 + 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 + 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 + 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").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() { @@ -52,7 +52,7 @@ public class Xoa_url_parser__url_bar_tst { 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 + 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 } @Test public void Missing_page() { tstr.Run_parse_from_url_bar("http://a.org").Chk_is_null(); // unknown wiki; return null; @@ -60,6 +60,9 @@ public class Xoa_url_parser__url_bar_tst { } @Test public void Invalid_names() { tstr.Run_parse_from_url_bar("http://a/b/c").Chk_is_null(); // unknown url - tstr.Run_parse_from_url_bar("war").Chk_to_str("en.wikipedia.org/wiki/war"); // word looks like lang, but is actually page; default to current + tstr.Run_parse_from_url_bar("war").Chk_to_str("en.wikipedia.org/wiki/War"); // word looks like lang, but is actually page; default to current + } + @Test public void Proper_case() { + tstr.Run_parse_from_url_bar("a" ).Chk_to_str("en.wikipedia.org/wiki/A"); // "a" -> "A" x> "a" } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__wiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java similarity index 93% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__wiki_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java index e17b3f610..c32ac95c0 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__wiki_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__wiki_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__wiki_tst { + private final Xow_url_parser_fxt tstr = new Xow_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"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xcmd_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java similarity index 90% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xcmd_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java index 6997c2e34..4affd34b6 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xcmd_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; -public class Xoa_url_parser__xcmd_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__xcmd_tst { + private final Xow_url_parser_fxt tstr = new Xow_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"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xwiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java similarity index 96% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xwiki_tst.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java index 551e61d91..5e5a48792 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser__xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import org.junit.*; import gplx.xowa.wikis.nss.*; -public class Xoa_url_parser__xwiki_tst { - private final Xoa_url_parser_fxt tstr = new Xoa_url_parser_fxt(); +public class Xow_url_parser__xwiki_tst { + private final Xow_url_parser_fxt tstr = new Xow_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" diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java similarity index 58% rename from 400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java rename to 400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java index 072477cbf..32f5379e8 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.wikis.nss.*; -public class Xoa_url_parser_fxt { - protected final Xoae_app app; protected final Xowe_wiki cur_wiki; - protected final Xoa_url_parser parser; +public class Xow_url_parser_fxt { + protected final Xoae_app app; protected final Xowe_wiki cur_wiki; + protected final Xow_url_parser parser; protected Xoa_url actl_url; - public Xoa_url_parser_fxt() { - this.app = Xoa_app_fxt.app_(); + public Xow_url_parser_fxt() { + this.app = Xoa_app_fxt.Make__app__edit(); 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 @@ -30,53 +30,53 @@ public class Xoa_url_parser_fxt { 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); + Xowe_wiki rv = Xoa_app_fxt.Make__wiki__edit(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) { + public Xow_url_parser_fxt Prep_add_xwiki_to_wiki(String alias, String domain) {return Prep_xwiki(cur_wiki, alias, domain, null);} + public Xow_url_parser_fxt Prep_add_xwiki_to_wiki(String alias, String domain, String fmt) {return Prep_xwiki(cur_wiki, alias, domain, fmt);} + public Xow_url_parser_fxt Prep_add_xwiki_to_user(String domain) {return Prep_xwiki(app.Usere().Wiki(), domain, domain, null);} + public Xow_url_parser_fxt Prep_add_xwiki_to_user(String alias, String domain) {return Prep_xwiki(app.Usere().Wiki(), alias, domain, null);} + public Xow_url_parser_fxt Prep_add_xwiki_to_user(String alias, String domain, String fmt) {return Prep_xwiki(app.Usere().Wiki(), alias, domain, fmt);} + public Xow_url_parser_fxt Prep_xwiki(Xow_wiki wiki, String alias, String domain, String fmt) { wiki.Xwiki_mgr().Add_by_atrs(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.Dbmeta_mgr().Ns__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) { + public Xow_url_parser_fxt Run_parse(String actl_str) {return Run_parse(cur_wiki, actl_str);} + public Xow_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) { + public Xow_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) { + public Xow_url_parser_fxt Run_parse_from_url_bar(String raw) { this.actl_url = parser.Parse_by_urlbar_or_null(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_is_null() {Tfds.Eq_bool(true, actl_url == null); 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); + public Xow_url_parser_fxt Chk_tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;} + public Xow_url_parser_fxt Chk_is_null() {Tfds.Eq_bool(true, actl_url == null); return this;} + public Xow_url_parser_fxt Chk_vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;} + public Xow_url_parser_fxt Chk_wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;} + public Xow_url_parser_fxt Chk_wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;} + public Xow_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;} + public Xow_url_parser_fxt Chk_qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;} + public Xow_url_parser_fxt Chk_page_is_main_y() {return Chk_page_is_main(Bool_.Y);} + public Xow_url_parser_fxt Chk_page_is_main_n() {return Chk_page_is_main(Bool_.N);} + public Xow_url_parser_fxt Chk_page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;} + public Xow_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;} + public Xow_url_parser_fxt Chk_action_is_edit_y() {return Chk_action_is_edit_(Bool_.Y);} + public Xow_url_parser_fxt Chk_action_is_edit_n() {return Chk_action_is_edit_(Bool_.N);} + private Xow_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 Xow_url_parser_fxt Chk_to_str(String v) {return Chk_to_str(Bool_.Y, v);} + public Xow_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 Xow_url_parser_fxt Chk_build_str_is_same() { + Xow_url_parser parser = new Xow_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/bldrs/Db_mgr_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java index 7ecffc030..f1cd3e61e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; import gplx.core.primitives.*; import gplx.core.strings.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.wikis.ctgs.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.ctgs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.infos.*; public class Db_mgr_fxt { @@ -32,7 +32,7 @@ public class Db_mgr_fxt { public Xowd_page_itm doc_ttl_(int id, String title) {return bldr_fxt.doc_(id, "2012-01-02 03:04", title, "IGNORE");} public Db_mgr_fxt Init_fil(String url, String raw) {return Init_fil(Io_url_.new_fil_(url), raw);} public Db_mgr_fxt Init_fil(Io_url url, String raw) {Io_mgr.Instance.SaveFilStr(url, raw); return this;} - public Db_mgr_fxt Exec_run(Xobd_wkr wkr) {bldr_fxt.Run(wkr); return this;} + public Db_mgr_fxt Exec_run(Xob_page_wkr wkr) {bldr_fxt.Run(wkr); return this;} public Db_mgr_fxt Exec_run(Xob_cmd cmd) {bldr_fxt.Run_cmds(cmd); return this;} public Db_mgr_fxt Exec_run(Xobd_parser_wkr wkr) {bldr_fxt.Run(wkr); return this;} public void Init_page_insert(Int_obj_ref page_id_next, int ns_id, String[] ttls) { @@ -65,13 +65,6 @@ public class Db_mgr_fxt { wiki.Db_mgr_as_sql().Load_mgr().Load_page(actl.Id_(page_id), ns, false); Tfds.Eq(expd, String_.new_a7(actl.Text())); } - public void Test_search(String search_word_str, int... expd) { - Xowe_wiki wiki = bldr_fxt.Wiki(); - List_adp rv = List_adp_.new_(); - byte[] search_word_bry = Bry_.new_a7(search_word_str); - wiki.Db_mgr_as_sql().Load_mgr().Load_search(Cancelable_.Never, rv, search_word_bry, 100); - Tfds.Eq_ary(expd, Xto_int_ary(rv)); - } int[] Xto_int_ary(List_adp rslts) { int len = rslts.Count(); int[] rv = new int[len]; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java index 8421fe8b5..5750b75e5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java @@ -20,8 +20,8 @@ import gplx.core.ios.*; import gplx.xowa.bldrs.*; import gplx.xowa.wikis.data.tb public class Xob_base_fxt { public Xob_base_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); bldr = Xoa_app_fxt.bldr_(app); } this.Init_(bldr, wiki); @@ -66,7 +66,7 @@ public class Xob_base_fxt { cmd.Cmd_run(); cmd.Cmd_end(); } - public static void Run_wkr(Xob_bldr bldr, Xobd_wkr wkr, Xowd_page_itm[] page_ary) { + public static void Run_wkr(Xob_bldr bldr, Xob_page_wkr wkr, Xowd_page_itm[] page_ary) { wkr.Wkr_bgn(bldr); int page_ary_len = page_ary.length; for (int i = 0; i < page_ary_len; i++) { diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java index 990a9a5bf..086dff5fd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java @@ -26,8 +26,8 @@ public class Xob_bldr implements GfoInvkAble { this.import_marker = new Xob_import_marker(); this.wiki_cfg_bldr = new Xob_wiki_cfg_bldr(this); } - public Xoae_app App() {return app;} private final Xoae_app app; - public Xob_cmd_mgr Cmd_mgr() {return cmd_mgr;} private final Xob_cmd_mgr cmd_mgr; + public Xoae_app App() {return app;} private final Xoae_app app; + public Xob_cmd_mgr Cmd_mgr() {return cmd_mgr;} private final Xob_cmd_mgr cmd_mgr; public Gfo_usr_dlg Usr_dlg() {return app.Usr_dlg();} public int Sort_mem_len() {return sort_mem_len;} public Xob_bldr Sort_mem_len_(int v) {sort_mem_len = v; return this;} private int sort_mem_len = 16 * Io_mgr.Len_mb; public int Dump_fil_len() {return dump_fil_len;} public Xob_bldr Dump_fil_len_(int v) {dump_fil_len = v; return this;} private int dump_fil_len = 1 * Io_mgr.Len_mb; @@ -98,8 +98,9 @@ public class Xob_bldr implements GfoInvkAble { private static final String Invk_cmds = "cmds", Invk_wiki_cfg_bldr = "wiki_cfg_bldr" , Invk_pause_at_end_ = "pause_at_end_", Invk_sort_mem_len_ = "sort_mem_len_", Invk_dump_fil_len_ = "dump_fil_len_", Invk_make_fil_len_ = "make_fil_len_" - , Invk_run = "run", Invk_cancel = "cancel" + , Invk_cancel = "cancel" ; + public static final String Invk_run = "run"; } /* . make_fil_len: max size of made file; EX: /id/..../0000000001.csv will have max len of 64 KB diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java index 1875ffd57..66830572d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -32,7 +32,7 @@ public class Xob_cmd_keys { , Key_wiki_image = "wiki.image" // "wiki.image" , Key_wiki_page_dump_make = "wiki.page_dump.make" // "file.page_dump" , Key_wiki_page_dump_drop = "wiki.page_dump.drop" - , Key_wiki_pagelink = "wiki.pagelink" + , Key_wiki_page_link = "wiki.page_link" , Key_file_lnki_temp = "file.lnki_temp" , Key_file_lnki_regy = "file.lnki_regy" , Key_file_page_regy = "file.page_regy" @@ -50,6 +50,9 @@ public class Xob_cmd_keys { , Key_util_download = "util.download" // "file.download" , Key_util_xml_dump = "util.xml_dump" , Key_util_random = "util.random" + , Key_util_sqlite_normalize = "util.sqlite.normalize" + , Key_util_alert = "util.alert" + , Key_util_delete = "util.delete" , Key_wbase_json_dump = "wbase.json_dump" , Key_wbase_qid = "wbase.qid" // "text.wdata.qid" , Key_wbase_pid = "wbase.pid" // "text.wdata.pid" @@ -58,6 +61,9 @@ public class Xob_cmd_keys { , Key_diff_build = "diff.build" , Key_diff_merge = "diff.merge" , Key_text_delete_page = "text.delete_page" + , Key_search__page__page_score = "search.page__page_score" + , Key_search__link__link_score = "search.link__link_score" + , Key_search__word__link_count = "search.word__link_count" , Key_tdb_text_init = "tdb.text.init" // "core.init" , Key_tdb_make_page = "tdb.text.page" // "core.make_page" diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index 47fff3d4b..7a0495945 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -21,6 +21,7 @@ import gplx.xowa.wikis.*; import gplx.xowa.xtns.wdatas.imports.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.bldrs.cmds.texts.sqls.*; import gplx.xowa.bldrs.cmds.texts.tdbs.*; import gplx.xowa.bldrs.cmds.files.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.bldrs.cmds.utils.*; import gplx.xowa.bldrs.cmds.wikis.*; import gplx.xowa.bldrs.cmds.diffs.*; import gplx.xowa.files.origs.*; import gplx.xowa.htmls.core.bldrs.*; +import gplx.xowa.addons.searchs.dbs.bldrs.*; public class Xob_cmd_mgr implements GfoInvkAble { public Xob_cmd_mgr(Xob_bldr bldr) {this.bldr = bldr;} private Xob_bldr bldr; public void Clear() {list.Clear(); dump_rdrs.Clear();} @@ -31,8 +32,8 @@ public class Xob_cmd_mgr implements GfoInvkAble { if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_init)) return Add(new Xob_init_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_page)) return Xml_rdr_direct_add(wiki, new Xob_page_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_css)) return Add(new Xob_css_cmd(bldr, wiki)); - else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_wkr)) return Xml_rdr_direct_add(wiki, new Xob_search_sql_wkr(bldr, wiki)); - else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_cmd)) return Add(new Xob_search_sql_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_wkr)) return Xml_rdr_direct_add(wiki, new gplx.xowa.addons.searchs.dbs.bldrs.Srch_bldr_wkr(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_cmd)) return Add(new Srch_bldr_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_core_v1)) return Xml_rdr_parser_add(wiki, new Xob_ctg_v1_sql().Ctor(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_core)) return Add(new Xob_category_registry_sql(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_link)) return Add(new Xob_categorylinks_sql(bldr, wiki)); @@ -43,7 +44,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_dump_drop)) return Add(new Xob_page_dump_cmd_drop(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_redirect)) return Add(new Xob_redirect_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_image)) return Add(new Xob_image_cmd(bldr, wiki)); - else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_pagelink)) return Add(new Xob_pagelinks_parser_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_link)) return Add(new gplx.xowa.addons.pagelinks.bldrs.Pglnk_bldr_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_lnki_temp)) return Add(new Xob_lnki_temp_wkr(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_lnki_regy)) return Add(new Xob_lnki_regy_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_page_regy)) return Add(new Xob_page_regy_cmd(bldr, wiki)); @@ -57,13 +58,19 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_update)) return Add(new Xob_xfer_update_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_html_redlinks)) return Add(new Xob_redlink_mkr_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_cleanup)) return Add(new Xob_cleanup_cmd(bldr, wiki)); - else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_download)) return Add(new Xob_download_wkr(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_delete)) return Add(new Xob_delete_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_download)) return Add(new Xob_download_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_xml_dump)) return Add(new Xob_xml_dumper_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_json_dump)) return Add(new Xob_wbase_json_dump_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_qid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_sql().Ctor(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_pid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_sql().Ctor(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_db)) return Add(new Xob_wdata_db_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_site_meta)) return Add(new Xob_site_meta_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_search__page__page_score)) return Add(new gplx.xowa.addons.searchs.dbs.bldrs.cmds.Srch__page__page_score(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_search__link__link_score)) return Add(new gplx.xowa.addons.searchs.dbs.bldrs.cmds.Srch__link__link_score(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_search__word__link_count)) return Add(new gplx.xowa.addons.searchs.dbs.bldrs.cmds.Srch__word__link_count(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_sqlite_normalize)) return Add(new gplx.xowa.addons.sqlite_utils.bldrs.Sqlite_percentile_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_init)) return Add(new Xob_init_tdb(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_page)) return Xml_rdr_direct_add(wiki, new Xob_page_txt(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_id)) return Xml_rdr_direct_add(wiki, new Xob_make_id_wkr(bldr, wiki)); @@ -86,21 +93,21 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_deploy_copy)) return Add(new Xob_deploy_copy_cmd(bldr, wiki)); else throw Err_.new_unhandled(cmd_key); } - private Xobd_wkr Xml_rdr_direct_add(Xowe_wiki wiki, Xobd_wkr wkr) { - Xobd_rdr dump_rdr = Xml_rdr_get(wiki); + private Xob_page_wkr Xml_rdr_direct_add(Xowe_wiki wiki, Xob_page_wkr wkr) { + Xob_page_wkr_cmd dump_rdr = Xml_rdr_get(wiki); dump_rdr.Wkr_add(wkr); return wkr; } private Xobd_parser_wkr Xml_rdr_parser_add(Xowe_wiki wiki, Xobd_parser_wkr wkr) { - Xobd_rdr dump_rdr = Xml_rdr_get(wiki); + Xob_page_wkr_cmd dump_rdr = Xml_rdr_get(wiki); dump_rdr.Page_parser_assert().Wkr_add(wkr); return wkr; } - private Xobd_rdr Xml_rdr_get(Xowe_wiki wiki) { + private Xob_page_wkr_cmd Xml_rdr_get(Xowe_wiki wiki) { byte[] wiki_key = wiki.Domain_bry(); - Xobd_rdr rv = (Xobd_rdr)dump_rdrs.Get_by(dump_rdrs_ref.Val_(wiki_key)); + Xob_page_wkr_cmd rv = (Xob_page_wkr_cmd)dump_rdrs.Get_by(dump_rdrs_ref.Val_(wiki_key)); if (rv == null) { - rv = new Xobd_rdr(bldr, wiki); + rv = new Xob_page_wkr_cmd(bldr, wiki); dump_rdrs.Add(Bry_obj_ref.New(wiki_key), rv); this.Add(rv); } @@ -130,7 +137,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { int args_len = m.Args_count(); String[] cmds = new String[args_len - 1]; // -1 b/c 1st arg is wiki for (int i = 1; i < args_len; i++) { - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); cmds[i - 1] = kv.Val_to_str_or_empty(); } return Add_many(wiki, cmds); @@ -142,6 +149,11 @@ public class Xob_cmd_mgr implements GfoInvkAble { rv = Add_cmd(wiki, cmds[i]); return rv; } + public void Add_cmd_ary(Xob_cmd... cmds_ary) { + int cmds_len = cmds_ary.length; + for (int i = 0; i < cmds_len; ++i) + this.Add(cmds_ary[i]); + } private Xowe_wiki Wiki_get_or_make(GfoMsg m) { byte[] wiki_key = m.ReadBry("v"); Xoae_wiki_mgr wiki_mgr = bldr.App().Wiki_mgr(); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java index 9c912e870..4e777f80a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java @@ -22,17 +22,17 @@ public class Xob_db_file { this.url = url; this.conn = conn; this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg"); } - public Io_url Url() {return url;} private final Io_url url; - public Db_conn Conn() {return conn;} private final Db_conn conn; - public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg; - - public static Xob_db_file new__file_make(Io_url dir) {return new_(dir, Name__file_make);} - public static Xob_db_file new__page_regy(Io_url dir) {return new_(dir, Name__page_regy);} - public static Xob_db_file new__wiki_image(Io_url dir) {return new_(dir, Name__wiki_image);} - public static Xob_db_file new__wiki_redirect(Io_url dir) {return new_(dir, Name__wiki_redirect);} - public static Xob_db_file new__temp_log(Io_url dir) {return new_(dir, Name__temp_log);} - public static Xob_db_file new__redlink(Io_url dir) {return new_(dir, Name__redlink);} - public static Xob_db_file new_(Io_url dir, String name) { + public Io_url Url() {return url;} private final Io_url url; + public Db_conn Conn() {return conn;} private final Db_conn conn; + public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg; + public static Xob_db_file New__file_make(Io_url dir) {return New(dir, Name__file_make);} + public static Xob_db_file New__page_regy(Io_url dir) {return New(dir, Name__page_regy);} + public static Xob_db_file New__wiki_image(Io_url dir) {return New(dir, Name__wiki_image);} + public static Xob_db_file New__wiki_redirect(Io_url dir) {return New(dir, Name__wiki_redirect);} + public static Xob_db_file New__temp_log(Io_url dir) {return New(dir, Name__temp_log);} + public static Xob_db_file New__redlink(Io_url dir) {return New(dir, Name__redlink);} + public static Xob_db_file New__page_link(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), Name__page_link);} + public static Xob_db_file New(Io_url dir, String name) { Io_url url = dir.GenSubFil(name); Db_conn_bldr_data conn_data = Db_conn_bldr.Instance.Get_or_new(url); Db_conn conn = conn_data.Conn(); @@ -45,5 +45,6 @@ public class Xob_db_file { Name__wiki_image = "xowa.wiki.image.sqlite3", Name__wiki_redirect = "xowa.wiki.redirect.sqlite3" , Name__file_make = "xowa.file.make.sqlite3", Name__temp_log = "xowa.temp.log.sqlite3" , Name__page_regy = "xowa.file.page_regy.sqlite3", Name__redlink = "xowa.temp.redlink.sqlite3" + , Name__page_link = "xowa.wiki.pagelinks.sqlite3" ; } diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java index c121543a8..7bd474214 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java @@ -25,8 +25,8 @@ public class Xob_fxt { } public Xob_fxt Ctor(Io_url root_dir) { Db_conn_bldr.Instance.Reg_default_sqlite(); - app = Xoa_app_fxt.app_("linux", root_dir); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit("linux", root_dir); + wiki = Xoa_app_fxt.Make__wiki__edit(app); bldr = Xoa_app_fxt.bldr_(app); return this; } @@ -73,7 +73,7 @@ public class Xob_fxt { Run(wkr); return this; } - private void Run_wkr(Xobd_wkr wkr) { + private void Run_wkr(Xob_page_wkr wkr) { wkr.Wkr_bgn(bldr); for (int i = 0; i < doc_ary.length; i++) { Xowd_page_itm page = doc_ary[i]; @@ -111,10 +111,10 @@ public class Xob_fxt { Run(parser_wkr); return this; } - public Xob_fxt Run(Xobd_wkr... wkrs) { + public Xob_fxt Run(Xob_page_wkr... wkrs) { int doc_ary_len = doc_ary.length; for (int j = 0; j < wkrs.length; j++) { - Xobd_wkr wkr = wkrs[j]; + Xob_page_wkr wkr = wkrs[j]; wkr.Wkr_bgn(bldr); for (int i = 0; i < doc_ary_len; i++) { Xowd_page_itm page = doc_ary[i]; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java index b143277f4..5ec298c95 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java @@ -46,7 +46,7 @@ public class Xob_ns_to_db_mgr { if (db_id == Xob_ns_file_itm.Nth_db_id_null) // ns not assigned yet to db rv = Init_db(ns_file_itm); else - rv = db_mgr.Dbs__get_at(db_id); + rv = db_mgr.Dbs__get_by_id(db_id); long file_len = rv.File_len(); if (file_len + data_len > db_max) { // file is "full" Term_tbl(rv); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xobd_wkr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr.java similarity index 82% rename from 400_xowa/src/gplx/xowa/bldrs/Xobd_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr.java index 662a597ca..f31124b0b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xobd_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr.java @@ -16,12 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.wikis.data.tbls.*; -public interface Xobd_wkr extends GfoInvkAble { +public interface Xob_page_wkr extends GfoInvkAble { String Wkr_key(); - void Wkr_ini(Xob_bldr bldr); void Wkr_bgn(Xob_bldr bldr); - void Wkr_run(Xowd_page_itm page); + void Wkr_run(gplx.xowa.wikis.data.tbls.Xowd_page_itm page); void Wkr_end(); - void Wkr_print(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/Xobd_rdr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java similarity index 74% rename from 400_xowa/src/gplx/xowa/bldrs/Xobd_rdr.java rename to 400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java index b8ef25420..241414cab 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xobd_rdr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java @@ -16,23 +16,15 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; -import gplx.core.consoles.*; -import gplx.core.ios.*; -import gplx.xowa.wikis.nss.*; -import gplx.xowa.bldrs.xmls.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.parsers.tmpls.*; -public class Xobd_rdr implements Xob_cmd { - private Xob_bldr bldr; private Xowe_wiki wiki; - public Xobd_rdr(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;} - public String Cmd_key() {return KEY;} public static final String KEY = "dump_mgr"; - public void Cmd_init(Xob_bldr bldr) { - Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.To_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; - for (int i = 0; i < wkr_ary_len; i++) - wkr_ary[i].Wkr_ini(bldr); - } - public void Cmd_bgn(Xob_bldr bldr) {} - public void Cmd_end() {} +import gplx.core.consoles.*; import gplx.core.ios.*; +import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.parsers.tmpls.*; +import gplx.xowa.bldrs.xmls.*; +public class Xob_page_wkr_cmd implements Xob_cmd { + private final Xob_bldr bldr; private final Xowe_wiki wiki; + public Xob_page_wkr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;} + public String Cmd_key() {return KEY;} public static final String KEY = "dump_mgr"; public void Cmd_run() { - Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.To_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; + Xob_page_wkr[] wkr_ary = (Xob_page_wkr[])wkrs.To_ary(Xob_page_wkr.class); int wkr_ary_len = wkr_ary.length; for (int i = 0; i < wkr_ary_len; i++) wkr_ary[i].Wkr_bgn(bldr); Io_buffer_rdr fil = Io_buffer_rdr.Null; Xowd_page_itm page = new Xowd_page_itm(); Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); @@ -73,16 +65,15 @@ public class Xobd_rdr implements Xob_cmd { } finally {fil.Rls();} bldr.Usr_dlg().Prog_none("", "", "reading completed: performing post-processing clean-up"); - for (int i = 0; i < wkr_ary_len; i++) + for (int i = wkr_ary_len - 1; i > -1; --i) // NOTE: release in reverse order; needed to make sure txns are released correctly wkr_ary[i].Wkr_end(); } - public void Cmd_term() { - Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.To_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; - for (int i = 0; i < wkr_ary_len; i++) - wkr_ary[i].Wkr_print(); - } - public void Wkr_add(Xobd_wkr wkr) {wkrs.Add(wkr.Wkr_key(), wkr);} private Ordered_hash wkrs = Ordered_hash_.New(); - public Xobd_wkr Wkr_get(String key) {return (Xobd_wkr)wkrs.Get_by(key);} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_end() {} + public void Cmd_term() {} + public void Wkr_add(Xob_page_wkr wkr) {wkrs.Add(wkr.Wkr_key(), wkr);} private Ordered_hash wkrs = Ordered_hash_.New(); + public Xob_page_wkr Wkr_get(String key) {return (Xob_page_wkr)wkrs.Get_by(key);} public Xobd_parser Page_parser_assert() { if (page_parser == null) { page_parser = new Xobd_parser(); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xobd_parser.java b/400_xowa/src/gplx/xowa/bldrs/Xobd_parser.java index 3aace0108..5a2354f38 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xobd_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xobd_parser.java @@ -18,11 +18,10 @@ along with this program. If not, see . package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; import gplx.core.btries.*; import gplx.xowa.wikis.data.tbls.*; -public class Xobd_parser implements Xobd_wkr { +public class Xobd_parser implements Xob_page_wkr { private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; ctg.v1 assumes [[Category: private List_adp wkr_list = List_adp_.new_(); public String Wkr_key() {return KEY;} static final String KEY = "page_parser"; - public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_add(Xobd_parser_wkr wkr) {wkr_list.Add(wkr);} public void Wkr_bgn(Xob_bldr app) { int wkr_list_len = wkr_list.Count(); @@ -57,7 +56,6 @@ public class Xobd_parser implements Xobd_wkr { wkr.Wkr_end(); } } - public void Wkr_print() {} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { throw Err_.new_unimplemented(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java index daa35261f..fffa42568 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java @@ -150,7 +150,7 @@ public class Xob_wiki_cfg_bldr_tst { class Xob_wiki_cfg_bldr_fxt { public Xob_wiki_cfg_bldr_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); wiki_cfg_bldr = app.Bldr().Wiki_cfg_bldr(); } wiki_cfg_bldr.Clear(); @@ -162,14 +162,14 @@ class Xob_wiki_cfg_bldr_fxt { return this; } public Xob_wiki_cfg_bldr_fxt Expd_txt(String wiki, String text) { - hash.Add(wiki, KeyVal_.new_(wiki, text)); + hash.Add(wiki, Keyval_.new_(wiki, text)); return this; } public void Test() { wiki_cfg_bldr.Exec(); int len = hash.Count(); for (int i = 0; i < len; i++) { - KeyVal kv = (KeyVal)hash.Get_at(i); + Keyval kv = (Keyval)hash.Get_at(i); String wiki = kv.Key(); String expd = (String)kv.Val(); String actl = Io_mgr.Instance.LoadFilStr(app.Fsys_mgr().Cfg_wiki_core_dir().GenSubFil(wiki + ".gfs")); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java index adb4d84ea..82848a145 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java @@ -47,10 +47,10 @@ class Xob_dump_src_id { private DataRdr New_rdr(Xodb_mgr_sql db_mgr, String page_db_url, int text_db_idx, int cur_ns, int prv_id, byte redirect) { if (cur_text_db_idx != text_db_idx) { cur_text_db_idx = text_db_idx; - Xowd_db_file text_db = db_mgr.Core_data_mgr().Dbs__get_at(text_db_idx); + Xowd_db_file text_db = db_mgr.Core_data_mgr().Dbs__get_by_id(text_db_idx); Db_conn conn = text_db.Conn(); - String sql = String_.Format(Sql_select_itm, New_rdr__redirect_clause(redirect)); - text_stmt = conn.Stmt_new(Db_qry_sql.rdr_(sql)); + String sql = String_.Format(Sql_select_clause, New_rdr__redirect_clause(redirect)); + text_stmt = conn.Stmt_sql(sql); } return text_stmt.Clear().Val_int(prv_id).Val_int(cur_ns).Exec_select(); } @@ -75,7 +75,7 @@ class Xob_dump_src_id { default: throw Err_.new_unhandled(redirect); } } - private static final String Sql_select_itm = String_.Concat_lines_nl + private static final String Sql_select_clause = String_.Concat_lines_nl ( "SELECT p.page_id" , ", p.page_title" , ", t.text_data" 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 d3bcd9365..e5f03c447 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 @@ -1072,4 +1072,4 @@ Init_itm(1024, Bry_.New_by_ints(92,52,1,134,143,1,143,5)); if (trie.Match_bgn(uca, 0, uca.length) == null) trie.Add_obj(uca, gplx.core.intls.Utf16_.Encode_int_to_bry(charAsInt)); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java index d45f666a8..5c1865b8d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java @@ -32,7 +32,7 @@ public class Xob_category_registry_sql implements Xob_cmd { Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg(); wiki.Init_db_mgr(); Xowd_page_tbl page_core_tbl = wiki.Db_mgr_as_sql().Core_data_mgr().Tbl__page(); - Db_rdr rdr = page_core_tbl.Conn().Stmt_select_order(page_core_tbl.Tbl_name(), String_.Ary(page_core_tbl.Fld_page_title(), page_core_tbl.Fld_page_id()), String_.Ary(page_core_tbl.Fld_page_ns()), page_core_tbl.Fld_page_title()) + Db_rdr rdr = page_core_tbl.conn.Stmt_select_order(page_core_tbl.Tbl_name(), String_.Ary(page_core_tbl.Fld_page_title(), page_core_tbl.Fld_page_id()), String_.Ary(page_core_tbl.Fld_page_ns()), page_core_tbl.Fld_page_title()) .Crt_int(page_core_tbl.Fld_page_ns(), Xow_ns_.Tid__category) .Exec_select__rls_auto(); try { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java index 6f612beae..2189bcb00 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java @@ -33,8 +33,8 @@ class Xowd_page_wkr_ctg_fxt { public Xowd_page_wkr_ctg_fxt ini_(String s) {src = Bry_.new_u8(s); return this;} public Xowd_page_wkr_ctg_fxt tst_(String... expd) { Xobd_parser mgr = new Xobd_parser(); - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); Xob_bldr bldr = Xoa_app_fxt.bldr_(app); Xobd_parser_wkr_ctg_tstr wkr = (Xobd_parser_wkr_ctg_tstr)new Xobd_parser_wkr_ctg_tstr().Ctor(bldr, wiki); byte[] bry = Bry_.new_a7("[[Category:"); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java index d6908a5ce..8bb2496ea 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_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.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.texts.*; +import org.junit.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.bldrs.cmds.texts.sqls.*; public class Xob_ctg_v1_sql_tst { @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java index 9353084ff..e1e8fb473 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java @@ -16,8 +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.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import gplx.core.ios.*; -import gplx.xowa.bldrs.sqls.*; +import gplx.core.ios.*; import gplx.xowa.bldrs.sqls.*; public class Xoctg_hiddencat_parser_txt extends Xoctg_hiddencat_parser_base { public Xoctg_hiddencat_parser_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} @Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_cat_hidden_sql;} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java index 177fa9b18..66c05bc0e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.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.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; +import gplx.core.brys.*; import gplx.core.brys.fmts.*; import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.diffs.*; import gplx.dbs.diffs.builds.*; import gplx.dbs.diffs.itms.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; class Xob_diff_build_wkr { @@ -40,12 +40,10 @@ class Xob_diff_build_wkr { String made_by = wiki.App().User().Key(); Gdif_job_itm job_itm = dif_core.New_job(name, made_by); Gdif_bldr_ctx ctx = new Gdif_bldr_ctx().Init(dif_core, job_itm); - Gfdb_diff_wkr__db dif_wkr = new Gfdb_diff_wkr__db(); Gdif_db dif_db = dif_core.Db(); dif_wkr.Init_conn(dif_db, 1000); dif_bldr.Init(dif_wkr); - // wiki.Data__core_mgr().Db__core().Conn().Conn_info(); Xowd_db_file[] db_files = wiki.Data__core_mgr().Db__core().Tbl__db().Select_all(wiki.Data__core_mgr().Props(), Io_url_.Empty); int db_files_len = db_files.length; @@ -64,8 +62,8 @@ class Xob_diff_build_wkr { // } } private void Compare(Gdif_bldr_ctx ctx) { - Dbmeta_tbl_mgr old_tbl_mgr = old_conn.Meta_tbl_load_all(); - Dbmeta_tbl_mgr new_tbl_mgr = old_conn.Meta_tbl_load_all(); + Dbmeta_tbl_mgr old_tbl_mgr = old_conn.Meta_load_all(); + Dbmeta_tbl_mgr new_tbl_mgr = old_conn.Meta_load_all(); int new_tbl_len = new_tbl_mgr.Len(); for (int i = 0; i < new_tbl_len; ++i) { Dbmeta_tbl_itm new_tbl = new_tbl_mgr.Get_at(i); 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 5ebbb81dd..e7f18e1ff 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,20 +38,20 @@ 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_.To_int_or(name, 9 , 13, Int_.Min_value); if (pt_id == Int_.Min_value) 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_.Min_value); if (pt_id == Int_.Min_value) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().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) { byte[] ns_bgn_tkn = Bry_.new_a7("file-ns."), ns_end_tkn = Bry_.new_a7("-db."), pt_end_tkn = Bry_.new_a7(".xowa"); int ns_bgn_tkn_len = ns_bgn_tkn.length, ns_end_tkn_len = ns_end_tkn.length; byte[] name = Bry_.new_u8(fil.Url_rel()); // EX: en.wikipedia.org-file-ns.000-db.001.xowa - int ns_bgn = Bry_find_.Find_fwd(name, ns_bgn_tkn, 0); if (ns_bgn == Bry_find_.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_bgn", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw()); + int ns_bgn = Bry_find_.Find_fwd(name, ns_bgn_tkn, 0); if (ns_bgn == Bry_find_.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_bgn", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Raw()); ns_bgn += ns_bgn_tkn_len; - int ns_end = Bry_find_.Find_fwd(name, ns_end_tkn, ns_bgn); if (ns_end == Bry_find_.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 ns_end = Bry_find_.Find_fwd(name, ns_end_tkn, ns_bgn); if (ns_end == Bry_find_.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Raw()); int pt_bgn = ns_end + ns_end_tkn_len; - int pt_end = Bry_find_.Find_fwd(name, pt_end_tkn, pt_bgn); if (pt_end == Bry_find_.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_.To_int_or(name, ns_bgn, ns_end, Int_.Min_value); if (ns_id == Int_.Min_value) 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_.Min_value); if (pt_id == Int_.Min_value) 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_end = Bry_find_.Find_fwd(name, pt_end_tkn, pt_bgn); if (pt_end == Bry_find_.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Raw()); + int ns_id = Bry_.To_int_or(name, ns_bgn, ns_end, Int_.Min_value); if (ns_id == Int_.Min_value) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Raw()); + int pt_id = Bry_.To_int_or(name, pt_bgn, pt_end, Int_.Min_value); if (pt_id == Int_.Min_value) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().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_diff_regy_exec_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java index 58420633f..7766be11a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java @@ -25,8 +25,8 @@ public class Xob_diff_regy_exec_cmd_tst { fxt.Test_parse_url("/file/enwiki-001-atr.sql", "enwiki", 1, Fsdb_db_tid_.Tid_atr); } // @Test public void Smoke() { -// Xoae_app app = Xoa_app_fxt.app_(Io_url_.new_dir_("C:\\xowa\\"), "wnt"); -// Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); +// Xoae_app app = Xoa_app_fxt.Make__app__edit(Io_url_.new_dir_("C:\\xowa\\"), "wnt"); +// Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); // Xob_diff_regy_make_cmd cmd = new Xob_diff_regy_make_cmd(app.Bldr(), wiki); // cmd.Cmd_run(); // } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java index 5c5d480d3..61eb4512c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java @@ -28,15 +28,15 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm public void Cmd_end() {} public void Cmd_term() {} private void Exec_main() { - Db_conn make_db_provider = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn make_db_provider = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); this.Make_join_indexes(make_db_provider); this.Make_diff_regy(make_db_provider); this.Make_delete_sql(make_db_provider); } private void Make_join_indexes(Db_conn make_db_provider) { try { - make_db_provider.Ddl_create_idx(Dbmeta_idx_itm.new_normal_by_name("fsdb_regy", "fsdb_regy__join", "fsdb_name", "fsdb_is_orig", "fsdb_repo", "fsdb_w", "fsdb_time", "fsdb_page")); - make_db_provider.Ddl_create_idx(Dbmeta_idx_itm.new_normal_by_name("xfer_regy", "xfer_regy__join", "lnki_ttl", "file_is_orig", "orig_repo", "file_w", "lnki_time", "lnki_page")); + make_db_provider.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("fsdb_regy", "fsdb_regy__join", "fsdb_name", "fsdb_is_orig", "fsdb_repo", "fsdb_w", "fsdb_time", "fsdb_page")); + make_db_provider.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("xfer_regy", "xfer_regy__join", "lnki_ttl", "file_is_orig", "orig_repo", "file_w", "lnki_time", "lnki_page")); } catch (Exception exc) { app.Usr_dlg().Warn_many("", "", "error while making indexes: err=~{0}", Err_.Message_gplx_full(exc)); 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 dee56eb25..29d6acea6 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 @@ -80,7 +80,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { if (!trg_atr_fil.Conn().Eq(trg_cfg_mgr.Tbl().Conn())) // need to create txn for v1; DATE:2015-07-04 trg_cfg_mgr.Tbl().Conn().Txn_bgn("bldr__fsdb_make__trg_cfg_fil"); // bldr_db - Xob_db_file bldr_db = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); + Xob_db_file bldr_db = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()); this.bldr_conn = bldr_db.Conn(); this.bldr_cfg_tbl = bldr_db.Tbl__cfg(); // NOTE: cfg and atr is in same db; use it bldr_cfg_tbl.Conn().Txn_bgn("bldr__fsdb_make__bldr_cfg_tbl"); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java index c04375684..6d2002b60 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java @@ -23,7 +23,7 @@ public class Xob_lnki_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return Xob_cmd_keys.Key_file_lnki_regy;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_lnki_regy_tbl.Create_table(conn); Xob_lnki_regy_tbl.Create_data(usr_dlg, conn, Xob_lnki_temp_wkr.Ns_file_is_case_match_all(wiki)); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java index 320efdb30..d0290665a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java @@ -39,7 +39,7 @@ class Xob_lnki_temp_tbl { private Db_stmt stmt_insert; public Xob_lnki_temp_tbl(Db_conn conn) {this.conn = conn;} public Db_conn Conn() {return conn;} private final Db_conn conn; - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(Tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("bldr__lnki_temp"); stmt_insert = conn.Stmt_insert(Tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 4b2c1d3f6..ecc843c25 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -42,7 +42,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements gplx.xowa.pa } @Override protected Db_conn Init_db_file() { ctx.Lnki().File_logger_(this); - Xob_db_file make_db = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); + Xob_db_file make_db = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()); Db_conn make_conn = make_db.Conn(); this.tbl = new Xob_lnki_temp_tbl(make_conn); tbl.Create_tbl(); this.gen_hdump = hdump_bldr.Init(wiki, make_conn); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java index 61e59f6d6..df0ad633a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java @@ -23,7 +23,6 @@ public class Xob_lnki_temp_wkr_tst { fxt.Init_Xto_commons(true); fxt.Test_Xto_commons("a", "A"); fxt.Test_Xto_commons("A", null); - fxt.Init_Xto_commons(false); fxt.Test_Xto_commons("a", null); fxt.Test_Xto_commons("A", null); @@ -33,12 +32,11 @@ class Xob_lnki_temp_wkr_fxt { private boolean wiki_ns_file_is_case_match_all; private Xowe_wiki commons_wiki; public Xob_lnki_temp_wkr_fxt Init_Xto_commons(boolean wiki_ns_file_is_case_match_all) { - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); this.wiki_ns_file_is_case_match_all = wiki_ns_file_is_case_match_all; - this.commons_wiki = Xoa_app_fxt.wiki_tst_(app); // commons_wiki will default to Xow_ns.Id_file of case_match_1st + this.commons_wiki = Xoa_app_fxt.Make__wiki__edit(app); // commons_wiki will default to Xow_ns.Id_file of case_match_1st return this; } - public void Test_Xto_commons(String ttl, String expd) { Tfds.Eq(expd, String_.new_u8(Xob_lnki_temp_wkr.Xto_commons(wiki_ns_file_is_case_match_all, commons_wiki, Bry_.new_u8(ttl)))); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java index 6cd1538ed..cc708dc08 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java @@ -25,7 +25,7 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return Xob_cmd_keys.Key_file_orig_regy;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_orig_regy_tbl.Create_table(conn); Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); Xowe_wiki repo_0 = wiki, repo_1 = commons_wiki; @@ -34,7 +34,7 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { repo_1 = wiki; } repo_0.Init_assert(); repo_1.Init_assert(); - Xob_db_file file_registry_db = Xob_db_file.new__page_regy(commons_wiki.Fsys_mgr().Root_dir()); + Xob_db_file file_registry_db = Xob_db_file.New__page_regy(commons_wiki.Fsys_mgr().Root_dir()); Xob_orig_regy_tbl.Create_data(bldr.Usr_dlg(), conn, file_registry_db, repo_0_is_remote, repo_0, repo_1, Xob_lnki_temp_wkr.Ns_file_is_case_match_all(wiki)); } public void Cmd_run() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java index 6813aeac3..ce861b208 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java @@ -57,11 +57,9 @@ class Xob_orig_regy_tbl { String lnki_ttl_fld = wiki_has_cs_file ? "Coalesce(o.lnki_commons_ttl, o.lnki_ttl)" : "o.lnki_ttl"; // NOTE: use lnki_commons_ttl if [[File]] is cs PAGE:en.d:water EX:[[image:wikiquote-logo.png|50px|none|alt=]]; DATE:2014-09-05 if (wiki_has_cs_file) Sqlite_engine_.Idx_create(usr_dlg, conn, "orig_regy", Idx_ttl_remote); - Db_attach_cmd.new_(conn, "image_db", join) - .Add_fmt("orig_regy:updating page" , Sql_update_repo_page, repo_tid, lnki_ttl_fld) - .Add_fmt("orig_regy:updating redirect" , Sql_update_repo_redirect, repo_tid, lnki_ttl_fld) - .Exec() - ; + new Db_attach_mgr(conn, new Db_attach_itm("image_db", join)) + .Exec_sql_w_msg("orig_regy:updating page" , Sql_update_repo_page, repo_tid, lnki_ttl_fld) + .Exec_sql_w_msg("orig_regy:updating redirect" , Sql_update_repo_redirect, repo_tid, lnki_ttl_fld); } private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_conn p, Xowe_wiki local_wiki, Io_url repo_remote_dir) { p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_mark_dupes); // orig_regy: find dupes; see note in SQL @@ -145,7 +143,7 @@ class Xob_orig_regy_tbl { , ", i.img_minor_mime" , ", i.img_timestamp" , "FROM orig_regy o" - , " JOIN image i ON {1} = i.img_name" + , " JOIN image i ON {1} = i.img_name" , " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 0 AND {1} = m.src_ttl" , "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20 // , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22 @@ -176,7 +174,7 @@ class Xob_orig_regy_tbl { , ", i.img_timestamp" , "FROM orig_regy o" , " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 1 AND {1} = m.src_ttl" - , " JOIN image i ON m.trg_ttl = i.img_name" + , " JOIN image i ON m.trg_ttl = i.img_name" , "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20 // , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22 , "ORDER BY 1" // must order by lnki_id since it is PRIMARY KEY, else sqlite will spend hours shuffling rows in table diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java index fd5d2ddba..d4623ad7e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java @@ -25,7 +25,7 @@ public class Xob_orig_regy_update_cmd extends Xob_itm_basic_base implements Xob_ public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { // Xof_orig_mgr qry_mgr = new Xof_orig_mgr(); - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_orig_regy_update_bmk_mgr bmk = new Xob_orig_regy_update_bmk_mgr(); bmk.Init(conn, this.Cmd_key(), true, false, true); bmk.Load(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java index 28ff30be2..69cede813 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java @@ -26,7 +26,7 @@ public class Xob_page_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); - Db_conn page_regy_provider = Xob_db_file.new__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn page_regy_provider = Xob_db_file.New__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); commons_wiki.Init_assert(); if (build_commons) { Xob_page_regy_tbl.Reset_table(page_regy_provider); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java index 73468d7de..8a77c727b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java @@ -24,7 +24,7 @@ public class Xob_xfer_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); conn.Txn_bgn("bldr__xfer_regy"); Xob_xfer_regy_tbl.Create_table(conn); Xob_xfer_regy_tbl.Create_data(usr_dlg, conn); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java index b46214c72..41d1f69bd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java @@ -42,10 +42,10 @@ public class Xob_xfer_regy_tbl { ; return conn.Exec_qry_as_old_rdr(qry); } - public static Db_stmt Select_by_page_id_stmt(Db_conn p) {return p.Stmt_new(Db_qry_sql.rdr_(Sql_select_itm));} + public static Db_stmt Select_by_page_id_stmt(Db_conn p) {return p.Stmt_sql(Sql_select_clause);} public static DataRdr Select_by_page_id(Db_stmt stmt, int page_id, int limit) {return stmt.Val_int(page_id).Val_int(limit).Exec_select();} private static final String - Sql_select_itm = String_.Concat_lines_nl + Sql_select_clause = String_.Concat_lines_nl ( "SELECT *" , "FROM xfer_regy" , "WHERE xfer_status = 0" diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java index fd1a23107..9b0ae6d9e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java @@ -28,7 +28,7 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ public void Cmd_term() {} private void Exec_main() { wiki.Init_assert(); // NOTE: must init wiki to set up db_core; DATE:2015-08-17 - Db_conn make_db_provider = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn make_db_provider = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); this.Copy_atrs_to_make_db(make_db_provider); this.Update_status(make_db_provider); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java index ee5deeb14..0c855adde 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java @@ -26,11 +26,11 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_temp_orig;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); conn.Txn_bgn("bldr__xfer_temp"); - DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_itm); + DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_clause); long[] ext_maxs = Calc_ext_max(); while (rdr.MoveNextPeer()) { int lnki_ext = rdr.ReadByte(Xob_lnki_regy_tbl.Fld_lnki_ext); @@ -76,7 +76,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm public void Cmd_end() {} public void Cmd_term() {} private static final String - Sql_select_itm = String_.Concat_lines_nl + Sql_select_clause = String_.Concat_lines_nl ( "SELECT DISTINCT" , " l.lnki_id" // , ", lnki_ttl" diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java index 3570ab88c..5737eb4e4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java @@ -24,11 +24,11 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_temp_thumb;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); conn.Txn_bgn("bldr__xfer_temp_thumb"); - DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_itm); + DataRdr rdr = conn.Exec_sql_as_old_rdr(Sql_select_clause); Xob_xfer_temp_itm temp_itm = new Xob_xfer_temp_itm(); Xof_img_size img_size = new Xof_img_size(); byte[] cur_ttl = Bry_.Empty; byte cur_repo = Byte_.Max_value_127; @@ -52,7 +52,7 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c public void Cmd_end() {} public void Cmd_term() {} private static final String - Sql_select_itm = String_.Concat_lines_nl + Sql_select_clause = String_.Concat_lines_nl ( "SELECT l.lnki_id" , ", l.lnki_tier_id" , ", l.lnki_page_id" diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java index ea4c7ee1d..c81e0d78a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java @@ -24,78 +24,75 @@ public class Xob_xfer_temp_itm_tst { private Xob_xfer_temp_itm_fxt fxt = new Xob_xfer_temp_itm_fxt(); @Before public void init() {fxt.Reset();} @Test public void Pass() {fxt.Test_pass().Test_itm_chk_fail_id_none();} - @Test public void Missing_orig() {fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_page_id_is_null , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_page_id, null));} - @Test public void File_is_audio() {fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_media_type_is_audio , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_media_type, Xof_media_type.Name_audio));} + @Test public void Missing_orig() {fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_page_id_is_null , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_page_id, null));} + @Test public void File_is_audio() {fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_media_type_is_audio , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_media_type, Xof_media_type.Name_audio));} @Test public void File_is_mid() { - fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_media_type_is_audio , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext, Xof_ext_.Id_mid)); + fxt.Test_fail(Xob_xfer_temp_itm.Chk_tid_orig_media_type_is_audio , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext, Xof_ext_.Id_mid)); } @Test public void Redirect_src_is_empty() { // orig_cmd sets all direct files to have "orig_join" == "lnki_ttl" fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "A.png") - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "A.png") + , Keyval_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") ); fxt.Test_lnki_redirect_src(""); // confirm redirect_src set to "" } @Test public void Redirect_src_has_val() { // orig_cmd sets all redirect files to have "orig_join" = redirect and "lnki_ttl" as orig; EX: A.png redirects to B.png; orig_join will be B.png (the actual image) and redirect_src will be A.png (the original lnki) fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "B.png") - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "B.png") + , Keyval_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") ); fxt.Test_lnki_redirect_src("A.png"); // confirm redirect_src set to "" } @Test public void Redirect_should_take_trg_ext() {// if "A.png" redirects to "B.jpg", ext_id should be ".jpg" (the actual file) not ".png (lnki_ext_id) fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "B.jpg") - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) // .png b/c B.jpg + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ttl , "B.jpg") + , Keyval_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") + , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) // .png b/c B.jpg ); fxt.Test_lnki_ext_id(Xof_ext_.Id_jpg); // confirm ext changed to .jpg } @Test public void Thumbtime_check() {// PURPOSE: one image actually had a thumbtime defined; EX: General_Dynamics_F-16_Fighting_Falcon; [[File:Crash.arp.600pix.jpg|thumb|thumbtime=2]] fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_time , (double)3) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_time , (double)3) ); fxt.Test_lnki_thumbtime(Xof_lnki_time.Null); - fxt.Reset().Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_media_type , Xof_media_type.Name_video) - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_time , (double)3) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_media_type , Xof_media_type.Name_video) + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_time , (double)3) ); fxt.Test_lnki_thumbtime(3); } @Test public void Page_check() { fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_jpg) + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) ); fxt.Test_lnki_page(Xof_lnki_page.Null); - fxt.Reset().Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_pdf) - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_pdf) + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) ); fxt.Test_lnki_page(3); - fxt.Reset().Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_djvu) - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_file_ext , Xof_ext_.Id_djvu) + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_page , 3) ); fxt.Test_lnki_page(3); } @Test public void Media_should_be_ignored() {// ignore [[Media:]] for xfer_thumb (needed for xfer_orig) fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_src_tid , Xop_file_logger_.Tid__media) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") + , Keyval_.new_(Xob_lnki_regy_tbl.Fld_lnki_src_tid , Xop_file_logger_.Tid__media) ); fxt.Test_itm_chk_fail_id(Xob_xfer_temp_itm.Chk_tid_ns_is_media); } @Test public void Orig_width_is_0() {// PURPOSE: ignore files with an orig width of 0; note that ogg files that are sometimes flagged as VIDEO; EX:2009_10_08_Marc_Randazza_interview.ogg; DATE:2014-08-20 fxt.Test_bgn - ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.ogg") - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_media_type , Xof_media_type.Name_video) // VIDEO - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_w , 0) // no width defined in image table - , KeyVal_.new_(Xob_orig_regy_tbl.Fld_orig_h , 0) + ( Keyval_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.ogg") + , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_media_type , Xof_media_type.Name_video) // VIDEO + , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_w , 0) // no width defined in image table + , Keyval_.new_(Xob_orig_regy_tbl.Fld_orig_h , 0) ); fxt.Test_itm_chk_fail_id(Xob_xfer_temp_itm.Chk_tid_orig_w_is_0); } @@ -154,16 +151,16 @@ class Xob_xfer_temp_itm_fxt { return this; } public Xob_xfer_temp_itm_fxt Test_pass() {return Test_bgn();} - public Xob_xfer_temp_itm_fxt Test_fail(byte fail_tid, KeyVal... kvs) { + public Xob_xfer_temp_itm_fxt Test_fail(byte fail_tid, Keyval... kvs) { Test_bgn(kvs); this.Test_itm_chk_fail_id(fail_tid); return this; } - public Xob_xfer_temp_itm_fxt Test_bgn(KeyVal... kvs) { + public Xob_xfer_temp_itm_fxt Test_bgn(Keyval... kvs) { Init_rdr_image(); int len = kvs.length; for (int i = 0; i < len; i++) { - KeyVal kv = kvs[i]; + Keyval kv = kvs[i]; Init_rdr(kv.Key(), kv.Val()); } this.Exec_load(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java index ee3f93d4b..7d0660a61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java @@ -24,12 +24,11 @@ public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_update;} public void Cmd_run() { // init vars - Xob_db_file cur_file = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); + Xob_db_file cur_file = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()); Db_conn conn = cur_file.Conn(); if (prv_url == null) { prv_url = wiki.Appe().Fsys_mgr().File_dir().GenSubFil_nest(wiki.Domain_str(), "bldr", Xob_db_file.Name__file_make); } - // run sql Sqlite_engine_.Tbl_rename(conn, "xfer_regy", "xfer_regy_old"); Xob_xfer_regy_tbl.Create_table(conn); @@ -38,7 +37,6 @@ public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd { Sqlite_engine_.Db_detach(conn, "old_db"); Sqlite_engine_.Tbl_delete(conn, "xfer_regy_old"); Xob_xfer_regy_tbl.Create_index(usr_dlg, conn); - // // rotate db // DateAdp wiki_date = wiki.Db_mgr().Dump_date_query(); // Io_url archive_url = prv_url.GenNewNameOnly("oimg_lnki_" + wiki_date.XtoStr_fmt("yyyyMMdd")); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java index 7575cf18b..a8b65282b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java @@ -22,7 +22,7 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.bldrs.filters.dansguardians.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.*; import gplx.xowa.parsers.utils.*; -public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInvkAble { +public class Xob_page_cmd extends Xob_itm_basic_base implements Xob_page_wkr, GfoInvkAble { private Xowd_db_mgr db_mgr; private Db_idx_mode idx_mode = Db_idx_mode.Itm_end; private Xowd_page_tbl page_core_tbl; private Io_stream_zip_mgr text_zip_mgr; private byte text_zip_tid; private Xop_redirect_mgr redirect_mgr; private Xob_redirect_tbl redirect_tbl; private boolean redirect_id_enabled; private DateAdp modified_latest = DateAdp_.MinValue; private int page_count_all, page_count_main = 0; private int commit_interval = 100000; // 100 k @@ -72,7 +72,7 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv ++page_count_all; if (ns.Id_is_main() && !page.Redirected()) ++page_count_main; if (page_count_all % commit_interval == 0) { - page_core_tbl.Conn().Txn_sav(); text_db.Conn().Txn_sav(); + page_core_tbl.conn.Txn_sav(); text_db.Conn().Txn_sav(); if (redirect_id_enabled) redirect_tbl.Conn().Txn_sav(); if (dg_match_mgr != null) dg_match_mgr.Commit(); } @@ -91,7 +91,7 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv if (redirect_id_enabled) { redirect_tbl.Conn().Txn_end(); redirect_tbl.Update_trg_redirect_id(db_core.Url(), 1); - redirect_tbl.Update_src_redirect_id(db_core.Url(), page_core_tbl.Conn()); + redirect_tbl.Update_src_redirect_id(db_core.Url(), page_core_tbl.conn); } } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { @@ -102,6 +102,4 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv return this; } private static final String Invk_commit_interval_ = "commit_interval_", Invk_idx_mode_ = "idx_mode_", Invk_redirect_id_enabled_ = "redirect_id_enabled_"; - public void Wkr_ini(Xob_bldr bldr) {} - public void Wkr_print() {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java index e5736d938..57ef1cfeb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.wikis.nss.*; +import org.junit.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.wikis.nss.*; public class Xob_page_cmd_tst { @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt(); @After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java index 55cdfadb0..17db703ea 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java @@ -26,10 +26,9 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { Xowd_db_file core_db = wiki.Data__core_mgr().Db__core(); Db_conn core_db_conn = core_db.Conn(); Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; - usr_dlg.Plog_many("", "", "creating page_filter"); if (!core_db_conn.Meta_tbl_exists("page_filter")) { - core_db_conn.Ddl_create_tbl + core_db_conn.Meta_tbl_create ( Dbmeta_tbl_itm.New("page_filter", new Dbmeta_fld_itm[] { Dbmeta_fld_itm.new_int("page_id").Primary_y_() , Dbmeta_fld_itm.new_int("page_text_db_id") @@ -38,7 +37,6 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { , Dbmeta_idx_itm.new_normal_by_tbl("page_filter", "page_id", "page_id") )); } - core_db_conn.Exec_sql_plog_ntx("finding missing redirects", String_.Concat_lines_nl_skip_last ( "INSERT INTO page_filter (page_id, page_text_db_id)" , "SELECT ptr.page_id, ptr.page_text_db_id" @@ -53,7 +51,6 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { , "AND ptr.page_redirect_id = -1" , ";" )); - try { Xowd_db_file[] db_files = core_db.Tbl__db().Select_all(wiki.Data__core_mgr().Props(), wiki.Fsys_mgr().Root_dir()); int len = db_files.length; @@ -69,9 +66,9 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { case Xowd_db_file_.Tid_search_core: db_file_is_search = Bool_.Y; break; } int db_id = db_file.Id(); - if (db_file_is_text) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting text: " + db_id, "DELETE FROM text WHERE page_id IN (SELECT page_id FROM page_filter WHERE page_text_db_id = {0});"); - if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting cat: " + db_id, "DELETE FROM cat_link WHERE cl_from IN (SELECT page_id FROM page_filter);"); - if (db_file_is_search) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting search:" + db_id, "DELETE FROM search_link WHERE page_id IN (SELECT page_id FROM page_filter);"); + if (db_file_is_text) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting text: " + db_id, "DELETE FROM text WHERE page_id IN (SELECT page_id FROM page_filter WHERE page_text_db_id = {0});"); + if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting cat: " + db_id, "DELETE FROM cat_link WHERE cl_from IN (SELECT page_id FROM page_filter);"); + if (db_file_is_search) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting search:" + db_id, "DELETE FROM search_link WHERE page_id IN (SELECT page_id FROM page_filter);"); if (db_file_is_text || db_file_is_cat || db_file_is_search) db_file.Conn().Env_vacuum(); } @@ -82,8 +79,7 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { usr_dlg.Plog_many("", "", ""); } private void Run_sql(Db_conn core_db_conn, Io_url db_url, int db_id, String prog_msg, String sql) { - Db_attach_cmd.new_(core_db_conn, "data_db", db_url) - .Add_fmt(prog_msg , sql, db_id) - .Exec(); + new Db_attach_mgr(core_db_conn, new Db_attach_itm("data_db", db_url)) + .Exec_sql_w_msg(prog_msg , sql, db_id); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_tst.java deleted file mode 100644 index a458d6849..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_pagelinks_parser_tst.java +++ /dev/null @@ -1,61 +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import org.junit.*; -public class Xob_pagelinks_parser_tst { -// @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt(); -// @After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();} - @Test public void Basic() { -// if (Xoa_test_.Db_skip()) return; -// fxt.Init_db_sqlite(); -// fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core().Create_tbl(); -// Init_ctgs(1, 2, 3); -// Io_url page_props_url = Xoa_test_.Url_root().GenSubFil_nest("root", "wiki", "en.wikipedia.org", "page_props.sql"); -// fxt .Init_fil(page_props_url, String_.Concat -// ( "INSERT INTO `page_props` VALUES" -// , " (1,'hiddencat','')" -// , ",(2,'pageimage','A.png')" -// , ",(3,'hiddencat','')" -// , ";" -// )) -// .Exec_run(new Xoctg_hiddencat_parser_sql(fxt.Bldr(), fxt.Wiki())) -// ; -// Tst_ctg_hidden(Bool_.Y, 1, 3); -// Tst_ctg_hidden(Bool_.N, 2); - } -// private void Init_ctgs(params int[] ctgs) { -// int len = ctgs.length; -// Xowd_cat_core_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core().Create_tbl(); -// tbl.Insert_bgn(); -// try { -// for (int i = 0; i < len; i++) { -// int ctg_id = ctgs[i]; -// tbl.Insert_cmd_by_batch(ctg_id, 0, 0, 0, Bool_.N_byte, 0); -// } -// } finally {tbl.Insert_end();} -// } -// private void Tst_ctg_hidden(boolean expd_hidden, params int[] ctgs) { -// int len = ctgs.length; -// Xowd_cat_core_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core(); -// for (int i = 0; i < len; i++) { -// int ctg_id = ctgs[i]; -// Xowd_category_itm ctg_itm = tbl.Select(ctg_id); -// Tfds.Eq(expd_hidden, ctg_itm.Hidden(), Int_.To_str(ctg_id)); -// } -// } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java deleted file mode 100644 index 3ae98a162..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java +++ /dev/null @@ -1,90 +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import gplx.core.envs.*; -import gplx.xowa.langs.*; -import gplx.xowa.bldrs.wkrs.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.*; -public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { // search version 2; upgrade - private int commit_interval = 100000, progress_interval = 10000; - public Xob_search_sql_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return Xob_cmd_keys.Key_text_search_cmd;} - public void Cmd_init(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) {} - public void Cmd_run() {this.Exec(wiki);} - public void Cmd_end() {} - public void Cmd_term() {} - public void Exec(Xowe_wiki wiki) { - if (!Env_.Mode_testing()) wiki.Init_assert(); - Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - db_mgr.Dbs__delete_by_tid(Xowd_db_file_.Tid_search_core); - Xowd_db_file search_db = Xob_search_sql_cmd.Dbs__get_or_make(db_mgr); - Db_conn search_conn = search_db.Conn(); - Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(search_conn, db_mgr.Props().Schema_is_1()); - search_temp_tbl.Create_tbl(); - search_conn.Exec_delete_all(search_temp_tbl.Tbl_name()); - search_temp_tbl.Insert_bgn(); - Xowd_page_tbl page_tbl = db_mgr.Tbl__page(); - Db_rdr page_rdr = page_tbl.Select_all(); - try { - Xol_lang_itm lang = wiki.Lang(); - Bry_bfr bfr = Bry_bfr.reset_(1024); - Ordered_hash hash = Ordered_hash_.New(); - int page_count = 0; - String fld_page_id = page_tbl.Fld_page_id(), fld_page_ttl = page_tbl.Fld_page_title(); - while (page_rdr.Move_next()) { - int page_id = page_rdr.Read_int(fld_page_id); - byte[] ttl = page_rdr.Read_bry_by_str(fld_page_ttl); - byte[][] words = Xob_search_base.Split_ttl_into_words(lang, hash, bfr, ttl); - int words_len = words.length; - for (int i = 0; i < words_len; i++) { - byte[] word = words[i]; - search_temp_tbl.Insert_cmd_by_batch(page_id, word); - } - ++page_count; - if ((page_count % commit_interval) == 0) - Commit(search_conn); - else if ((page_count % progress_interval) == 0) - usr_dlg.Prog_many("", "", "parse progress: count=~{0} last=~{1}", page_count, String_.new_u8(ttl)); - } - this.Commit(search_conn); - } - finally {page_rdr.Rls();} - search_conn.Txn_end(); - search_temp_tbl.Make_data(usr_dlg, db_mgr.Db__search().Tbl__search_link(), db_mgr.Db__search().Tbl__search_word()); - } - private void Commit(Db_conn search_conn) { - search_conn.Txn_sav(); - } - @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_progress_interval_)) progress_interval = m.ReadInt("v"); - else return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_progress_interval_ = "progress_interval_", Invk_commit_interval_ = "commit_interval_"; - public static Xowd_db_file Dbs__get_or_make(Xowd_db_mgr db_mgr) { - Xowd_db_file db = db_mgr.Props().Layout_text().Tid_is_all_or_few() - ? db_mgr.Db__core() - : db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_search_core) - ; - db.Tbl__search_word().Ddl__page_count_y_(); - db.Tbl__search_word().Create_tbl(); - db.Tbl__search_link().Create_tbl(); - return db; - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java deleted file mode 100644 index 1a8ada21e..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java +++ /dev/null @@ -1,52 +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.bldrs.cmds.ctgs.*; -import gplx.xowa.wikis.data.tbls.*; -public class Xob_search_sql_cmd_tst { - @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} private final Db_mgr_fxt fxt = new Db_mgr_fxt(); - @After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();} - @Test public void Basic() { - if (Xoa_test_.Db_skip()) return; - fxt.Init_db_sqlite(); - fxt.doc_ary_ - ( fxt.doc_ttl_(2, "A b") - , fxt.doc_ttl_(1, "B c") - ) - .Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki())) - .Exec_run(new Xob_search_sql_cmd(fxt.Bldr(), fxt.Wiki())) - ; - fxt.Test_search("a", 2); - fxt.Test_search("b", 1, 2); - fxt.Test_search("c", 1); - fxt.Test_search("d"); - } - @Test public void Wildcard() { - if (Xoa_test_.Db_skip()) return; - fxt.Init_db_sqlite(); - fxt.doc_ary_ - ( fxt.doc_ttl_(1, "A") - , fxt.doc_ttl_(2, "A2") - , fxt.doc_ttl_(3, "A3") - ) - .Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki())) - .Exec_run(new Xob_search_sql_cmd(fxt.Bldr(), fxt.Wiki())) - ; - fxt.Test_search("a*", 1, 2, 3); - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java deleted file mode 100644 index e3a391899..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java +++ /dev/null @@ -1,97 +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import gplx.core.ios.*; import gplx.core.encoders.*; import gplx.core.envs.*; -import gplx.xowa.bldrs.wkrs.*; -import gplx.xowa.langs.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; -public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { // search version 2 - private Xowd_db_mgr db_mgr; private Xowd_search_link_tbl search_page_tbl; private Xowd_search_word_tbl search_word_tbl; - private int search_id = 0; private byte[] prv_word = null; private int page_count; - public Xob_search_sql_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - @Override public String Wkr_key() {return Xob_cmd_keys.Key_text_search_wkr;} - @Override public gplx.core.ios.Io_make_cmd Make_cmd_site() {return this;} - public Io_sort_cmd Make_dir_(Io_url v) {return this;} // noop - public void Sort_bgn() { - this.usr_dlg = Xoa_app_.Usr_dlg(); - this.db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - Xob_search_sql_cmd.Dbs__get_or_make(db_mgr); - this.search_page_tbl = db_mgr.Db__search().Tbl__search_link(); - this.search_word_tbl = db_mgr.Db__search().Tbl__search_word(); - search_page_tbl.Insert_bgn(); search_word_tbl.Insert_bgn(); - } - public void Sort_do(Io_line_rdr rdr) {Sort_do(rdr.Bfr(), rdr.Key_pos_bgn(), rdr.Key_pos_end());} - public void Sort_do(byte[] line, int key_bgn, int key_end) {// EX: abc|123 - byte[] cur_word = Bry_.Mid(line, key_bgn, key_end); - if (!Bry_.Eq(cur_word, prv_word)) { // if new_word, insert old one - if (prv_word != null) // do not insert for 1st word - search_word_tbl.Insert_cmd_by_batch(search_id, prv_word, page_count); - ++search_id; - prv_word = cur_word; - page_count = 0; - } - search_page_tbl.Insert_cmd_by_batch(search_id, Base85_.To_int_by_bry(line, key_end + 1, key_end + 5)); // -1: ignore rdr_dlm - ++page_count; - if (search_id % 10000 == 0) usr_dlg.Prog_many("", "", "creating title index: count=~{0}", search_id); - } - public void Sort_end() { - search_word_tbl.Insert_cmd_by_batch(search_id, prv_word, page_count); - search_page_tbl.Insert_end(); search_word_tbl.Insert_end(); - Xowd_db_file search_db = db_mgr.Db__search(); - Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(search_db.Conn(), db_mgr.Props().Schema_is_1()); - search_temp_tbl.Create_idx(usr_dlg, search_page_tbl, search_word_tbl); - search_word_tbl.Ddl__page_count__cfg(search_db.Tbl__cfg()); - } -} -class Xob_search_wkr extends Xob_itm_basic_base implements Xobd_wkr { - private Xowd_db_file search_db; private Xowd_search_temp_tbl search_temp_tbl; - private Xol_lang_itm lang; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); private final Ordered_hash list = Ordered_hash_.New_bry(); - public String Wkr_key() {return Xob_cmd_keys.Key_text_search_wkr;} - public void Wkr_ini(Xob_bldr bldr) {} - public void Wkr_bgn(Xob_bldr bldr) { - if (!Env_.Mode_testing()) wiki.Init_assert(); - this.lang = wiki.Lang(); - Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - this.search_db = Xob_search_sql_cmd.Dbs__get_or_make(db_mgr); - this.search_temp_tbl = new Xowd_search_temp_tbl(search_db.Conn(), db_mgr.Props().Schema_is_1()); - search_temp_tbl.Create_tbl(); - search_temp_tbl.Insert_bgn(); - } - public void Wkr_run(Xowd_page_itm page) { - try { - int page_id = page.Id(); - byte[] ttl = page.Ttl_page_db(); - byte[][] words = Xob_search_base.Split_ttl_into_words(lang, list, tmp_bfr, ttl); - int len = words.length; - for (int i = 0; i < len; ++i) { - byte[] word = words[i]; - search_temp_tbl.Insert_cmd_by_batch(page_id, word); - } - } catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_full(e));} // never let single page crash entire import - } - public void Wkr_end() { - search_temp_tbl.Make_data(usr_dlg, search_db.Tbl__search_link(), search_db.Tbl__search_word()); - search_temp_tbl.Insert_end(); - } - public void Wkr_print() {} - @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_set)) {} - else return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_set = "set"; -} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr_tst.java deleted file mode 100644 index 2be2b4949..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr_tst.java +++ /dev/null @@ -1,68 +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; -public class Xob_search_sql_wkr_tst { - private final Xob_search_sql_wkr_fxt fxt = new Xob_search_sql_wkr_fxt(); - @Test public void Basic() { - fxt.Exec__sort - ( "a|!!!!#" - , "a|!!!!$" - , "b|!!!!#" - , "b|!!!!$" - , "b|!!!!%" - ); - fxt.Test__search_word - ( "1|a|2" - , "2|b|3" - ); - fxt.Test__search_link - ( "1|2" - , "1|3" - , "2|2" - , "2|3" - , "2|4" - ); - } -} -class Xob_search_sql_wkr_fxt { - private final Xob_search_sql_wkr wkr; - private final Xowe_wiki wiki; - private final Bry_bfr tmp_bfr = Bry_bfr.new_(); - public Xob_search_sql_wkr_fxt() { - Xoae_app app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); - Xoa_test_.Db__init__mem(wiki); - wkr = new Xob_search_sql_wkr(app.Bldr(), wiki); - } - public void Exec__sort(String... lines_str) { - byte[][] lines = Bry_.Ary(lines_str); - wkr.Sort_bgn(); - for (byte[] line : lines) - wkr.Sort_do(line, 0, Bry_find_.Find_fwd(line, Byte_ascii.Pipe)); - wkr.Sort_end(); - } - public void Test__search_word(String... lines) { - Xowd_search_word_tbl tbl = wiki.Data__core_mgr().Db__search().Tbl__search_word(); - Tfds.Eq_str_lines(String_.Concat_lines_nl(lines), Xoa_test_.Db__print_tbl_as_str(tmp_bfr, tbl.conn, tbl.Tbl_name(), tbl.Fld_id(), tbl.Fld_text(), tbl.Fld_page_count())); - } - public void Test__search_link(String... lines) { - Xowd_search_link_tbl tbl = wiki.Data__core_mgr().Db__search().Tbl__search_link(); - Tfds.Eq_str_lines(String_.Concat_lines_nl(lines), Xoa_test_.Db__print_tbl_as_str(tmp_bfr, tbl.conn, tbl.Tbl_name(), tbl.Fld_word_id(), tbl.Fld_page_id())); - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Srch_bldr_wkr_base.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Srch_bldr_wkr_base.java index aa0f4fae1..d5fb3c317 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Srch_bldr_wkr_base.java @@ -15,18 +15,13 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import gplx.core.primitives.*; -import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.wtrs.*; -import gplx.core.ios.*; -import gplx.xowa.langs.*; -import gplx.xowa.wikis.nss.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; -public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.core.primitives.*; import gplx.core.ios.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.wtrs.*; +import gplx.xowa.langs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; +public abstract class Srch_bldr_wkr_base extends Xob_itm_dump_base implements Xob_page_wkr { private final Ordered_hash list = Ordered_hash_.New(); private Xol_lang_itm lang; public abstract String Wkr_key(); - public abstract Io_make_cmd Make_cmd_site(); - public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { make_dir = wiki.Tdb_fsys_mgr().Ns_dir(); this.Init_dump(this.Wkr_key(), make_dir); @@ -36,7 +31,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ ns_main = wiki.Ns_mgr().Ns_main(); } private Xob_tmp_wtr_mgr tmp_wtr_mgr; private Xow_ns ns_main; public void Wkr_run(Xowd_page_itm page) { -// if (page.Ns_id() != Xow_ns_.Tid__main) return; // limit to main ns for now + // if (page.Ns_id() != Xow_ns_.Tid__main) return; // limit to main ns for now try { byte[] ttl = page.Ttl_page_db(); byte[][] words = Split_ttl_into_words(lang, list, dump_bfr, ttl); @@ -63,8 +58,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ tmp_wtr_mgr.Rls_all(); if (delete_temp) Io_mgr.Instance.DeleteDirDeep(temp_dir); } - public void Wkr_print() {} - // private static final int row_fixed_len = 5 + 1 + 1 + 1; // 5=rowId; 1=|; 1=NmsOrd; 1=| + public abstract Io_make_cmd Make_cmd_site(); public static byte[][] Split_ttl_into_words(Xol_lang_itm lang, Ordered_hash list, Bry_bfr bfr, byte[] ttl) { if (lang != null) // null lang passed in by searcher ttl = lang.Case_mgr().Case_build_lower(ttl); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java index 8d81b7add..db2f8ede7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.wikis.nss.*; -import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.wikis.data.site_stats.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; import gplx.xowa.wikis.tdbs.xdats.*; public class Xob_calc_stats_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_calc_stats_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} @@ -41,14 +41,14 @@ public class Xob_calc_stats_cmd extends Xob_itm_basic_base implements Xob_cmd { int count_file = Calc_count_articles(wiki.Ns_mgr().Ns_file()); Bry_bfr bfr = Bry_bfr.new_(); Gen_call(Bool_.Y, bfr, Xowe_wiki.Invk_stats); - Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_, count_main); - Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_files_, count_file); - Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_pages_, total); + Gen_call(Bool_.N, bfr, Xow_site_stats_mgr.Invk_number_of_articles_, count_main); + Gen_call(Bool_.N, bfr, Xow_site_stats_mgr.Invk_number_of_files_, count_file); + Gen_call(Bool_.N, bfr, Xow_site_stats_mgr.Invk_number_of_pages_, total); for (int i = 0; i < ns_len; i++) { Xow_ns ns = wiki.Ns_mgr().Ords_ary()[i]; if (ns.Id() < 0) continue; bfr.Add_byte_nl(); - Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.To_str_pad_bgn_zero(ns.Count(), 10)); + Gen_call(Bool_.N, bfr, Xow_site_stats_mgr.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.To_str_pad_bgn_zero(ns.Count(), 10)); } bfr.Add_byte_nl().Add_byte(Byte_ascii.Semic).Add_byte_nl(); Io_url wiki_gfs = Wiki_gfs_url(wiki); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java index 2a9993444..9f84b00cd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java @@ -33,8 +33,8 @@ public class Xob_init_base_tst { class Xob_init_base_fxt { public void Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); } Io_mgr.Instance.InitEngine_mem(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java index 7949edb5c..5680c2fd9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java @@ -18,10 +18,9 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.core.ios.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.wkrs.*; -public class Xob_make_id_wkr extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { +public class Xob_make_id_wkr extends Xob_itm_dump_base implements Xob_page_wkr, GfoInvkAble { public Xob_make_id_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Wkr_key() {return KEY;} public static final String KEY = "core.make_id"; - public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { this.Init_dump(KEY, wiki.Tdb_fsys_mgr().Site_dir().GenSubDir(Xotdb_dir_info_.Name_id)); } @@ -34,6 +33,5 @@ public class Xob_make_id_wkr extends Xob_itm_dump_base implements Xobd_wkr, GfoI this.Term_dump(new Xob_make_cmd_site(bldr.Usr_dlg(), make_dir, make_fil_len)); if (delete_temp) Io_mgr.Instance.DeleteDirDeep(temp_dir); } - public void Wkr_print() {} static final int row_fixed_len = 25 + 1 + 7; // 25=5 base_85 flds; 1=Redirect; 7=dlm } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java index 06484a8a6..009f71215 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java @@ -21,10 +21,9 @@ import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.wtrs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.parsers.utils.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.xdats.*; import gplx.xowa.wikis.tdbs.stats.*; -public class Xob_page_txt extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { +public class Xob_page_txt extends Xob_itm_dump_base implements Xob_page_wkr, GfoInvkAble { public Xob_page_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Wkr_key() {return Xob_cmd_keys.Key_tdb_make_page;} - public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { redirect_mgr = wiki.Redirect_mgr(); page_storage_type = wiki.Appe().Setup_mgr().Dump_mgr().Data_storage_format(); fsys_mgr = wiki.Tdb_fsys_mgr(); @@ -62,7 +61,6 @@ public class Xob_page_txt extends Xob_itm_dump_base implements Xobd_wkr, GfoInvk ttl_wtr_mgr.Rls_all(); if (delete_temp) Io_mgr.Instance.DeleteDirDeep(temp_dir); } - public void Wkr_print() {bldr.Usr_dlg().Note_many(GRP_KEY, "print", "~{0}", stat_mgr.Print(wiki.Ns_mgr()));} Xob_xdat_file_wtr Page_wtr_get(Xow_ns ns) { Xob_xdat_file_wtr rv = page_wtr_regy[ns.Ord()]; if (rv == null) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java index 6e06ba2cc..09559356a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java @@ -18,11 +18,10 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.core.ios.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.bldrs.wkrs.*; -public class Xob_parse_dump_templates_cmd extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { +public class Xob_parse_dump_templates_cmd extends Xob_itm_dump_base implements Xob_page_wkr, GfoInvkAble { public Xob_parse_dump_templates_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Wkr_key() {return KEY;} public static final String KEY = "parse.dump_templates"; public static final int FixedLen_page = 1 + 5 + 1 + 5 + 1 + 1 + 1; // \tid|date|title|text\n - public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { Init_dump(KEY); } @@ -33,5 +32,4 @@ public class Xob_parse_dump_templates_cmd extends Xob_itm_dump_base implements X Xotdb_page_itm_.Txt_page_save(dump_bfr, id, page.Modified_on(), title, text, true); } public void Wkr_end() {super.Flush_dump();} - public void Wkr_print() {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java index 273e7cba5..99c2511e4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import org.junit.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.wikis.nss.*; +import gplx.xowa.addons.searchs.dbs.bldrs.*; public class Xob_search_base_tst { @Test public void Split() { tst_Split("a", "a"); @@ -47,7 +48,7 @@ public class Xob_search_base_tst { } private Xob_fxt fxt = new Xob_fxt().Ctor_mem(); private void tst_Split(String raw, String... expd) { Ordered_hash list = Ordered_hash_.New(); Bry_bfr bfr = Bry_bfr.new_(); - byte[][] actl_bry = Xob_search_base.Split_ttl_into_words(fxt.App().Lang_mgr().Lang_en(), list, bfr, Bry_.new_u8(raw)); + byte[][] actl_bry = Srch_bldr_wkr_base.Split_ttl_into_words(fxt.App().Lang_mgr().Lang_en(), list, bfr, Bry_.new_u8(raw)); String[] actl = new String[actl_bry.length]; for (int i = 0; i < actl_bry.length; i++) actl[i] = String_.new_u8(actl_bry[i]); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java index 843ccbead..6b6c93dd2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.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.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; -public class Xob_search_tdb extends Xob_search_base { +import gplx.xowa.addons.searchs.dbs.bldrs.*; +public class Xob_search_tdb extends Srch_bldr_wkr_base { public Xob_search_tdb(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} @Override public String Wkr_key() {return Xob_cmd_keys.Key_tdb_make_search_title;} @Override public gplx.core.ios.Io_make_cmd Make_cmd_site() { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java index 606ed1c98..9b78cb72e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java @@ -170,11 +170,11 @@ public class Xob_tst { , "a", "b", "c"); } private void tst_Parse(String raw, String... expd) { - Xoae_app app = Xoa_app_fxt.app_(); // NOTE: resets mem file system, so must happen first + Xoae_app app = Xoa_app_fxt.Make__app__edit(); // NOTE: resets mem file system, so must happen first Io_url url = Io_url_.mem_fil_("mem/raw_page.csv"); Io_mgr.Instance.SaveFilStr(url, raw); Xotdb_page_raw_parser parser = new Xotdb_page_raw_parser(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); parser.Load(Gfo_usr_dlg_.Test(), wiki, new Xow_ns(Xow_ns_.Tid__template, Xow_ns_case_.Tid__1st, Bry_.new_a7("Template"), false), new Io_url[] {url}, 1 * Io_mgr.Len_kb); List_adp actl = List_adp_.new_(); Xowd_page_itm page = new Xowd_page_itm(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_alert_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_alert_cmd.java new file mode 100644 index 000000000..4e1e75d4c --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_alert_cmd.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.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.xowa.bldrs.wkrs.*; +import gplx.gfui.*; +public class Xob_alert_cmd extends Xob_cmd__base implements Xob_cmd { + public Xob_alert_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + public Xob_alert_cmd Msg_(String v) {this.msg = v; return this;} private String msg = "developer forgot to include message"; + @Override public String Cmd_key() {return Xob_cmd_keys.Key_util_alert;} + @Override public void Cmd_run() { + Gfui_kit kit = app.Gui_mgr().Kit(); + if (kit.Tid() != Gfui_kit_.Swt_tid) return; + kit.Ask_ok("", "", msg); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java index b0c3a8f72..94c67af09 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java @@ -36,7 +36,7 @@ public class Xob_cleanup_cmd extends Xob_itm_basic_base implements Xob_cmd { else if (String_.Eq(bz2_cmd, "move")) Io_mgr.Instance.MoveFil(bz2_fil, bz2_fil.OwnerDir().OwnerDir().GenSubFil_nest("done", bz2_fil.NameAndExt())); } - if (delete_xml) Io_mgr.Instance.DeleteFil(Xobd_rdr.Find_fil_by(wiki_root_dir, "*.xml")); + if (delete_xml) Io_mgr.Instance.DeleteFil(Xob_page_wkr_cmd.Find_fil_by(wiki_root_dir, "*.xml")); if (delete_tdb) { usr_dlg.Note_many("", "", "bldr.wiki:deleting tdb wiki"); Delete_tdb(wiki_root_dir); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_delete_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_delete_cmd.java new file mode 100644 index 000000000..66834f1f2 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_delete_cmd.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.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.core.ios.*; import gplx.core.envs.*; +import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.wms.dumps.*; +public class Xob_delete_cmd extends Xob_cmd__base implements Xob_cmd { + private String[] patterns_ary = String_.Ary_empty; + public Xob_delete_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + public Xob_delete_cmd Patterns_ary_(String... v) {this.patterns_ary = v; return this;} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_util_delete;} + @Override public void Cmd_run() { + int len = patterns_ary.length; if (len == 0) return; + + // build filter EX: '*.xml|*.txt' + Bry_bfr bfr = Bry_bfr.new_(); + for (int i = 0; i < len; ++i) { + String pattern = patterns_ary[i]; + if (i != 0) bfr.Add_byte_pipe(); + bfr.Add_str_u8(pattern); + } + + // get files; iterate and delete + String file_pattern = bfr.To_str_and_clear(); + Io_url[] files = Io_mgr.Instance.QueryDir_args(wiki.Fsys_mgr().Root_dir()).Recur_(Bool_.N).FilPath_(file_pattern).ExecAsUrlAry(); + int files_len = files.length; + for (int i = 0; i < files_len; ++i) { + Io_url file = files[i]; + if (file.Ext() == ".sqlite3") + Db_conn_bldr.Instance.Get_or_noop(file).Rls_conn(); + Io_mgr.Instance.DeleteFil(file); + } + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Null;} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_cmd.java similarity index 77% rename from 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_cmd.java index 65af5e23e..8ebcd85a6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_cmd.java @@ -17,19 +17,18 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.dbs.*; import gplx.core.ios.*; import gplx.core.envs.*; -import gplx.xowa.bldrs.wkrs.*; -import gplx.xowa.bldrs.wms.dumps.*; -public class Xob_download_wkr extends Xob_itm_basic_base implements Xob_cmd { - private String dump_date = "latest"; - private String dump_type = null; - private String dump_src = null; +import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.wms.dumps.*; +public class Xob_download_cmd extends Xob_cmd__base implements Xob_cmd { + private String dump_date = "latest", dump_type = null, dump_src = null; private Io_url dump_trg_zip = null, dump_trg_bin = null; private boolean unzip = true; - public Xob_download_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return Xob_cmd_keys.Key_util_download;} - public void Cmd_init(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) { - if (dump_type == null) throw Err_.new_wo_type("dump_type must be specified"); + public Xob_download_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + public Xob_download_cmd Dump_type_(String v) {dump_type = v; return this;} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_util_download;} + @Override public void Cmd_run() { + // init vars; if no explicit values, calc defaults; + if (dump_type == null) throw Err_.new_("bldr", "dump_type must be specified"); + if (!gplx.core.ios.IoEngine_system.Web_access_enabled) return; Xowm_dump_file dump_file = new Xowm_dump_file(wiki.Domain_str(), dump_date, dump_type); if (dump_src == null) { dump_file.Server_url_(app.Setup_mgr().Dump_mgr().Server_urls()[0]); @@ -39,33 +38,29 @@ public class Xob_download_wkr extends Xob_itm_basic_base implements Xob_cmd { dump_trg_zip = wiki.Fsys_mgr().Root_dir().GenSubFil(dump_file.File_name()); if (dump_trg_bin == null && unzip) dump_trg_bin = dump_trg_zip.GenNewNameAndExt(dump_trg_zip.NameOnly()); // convert a.sql.gz -> a.sql - } - public void Cmd_run() { + // download usr_dlg.Note_many("", "", "downloading file: now=~{0} src=~{1} trg=~{2}", DateAdp_.Now().XtoStr_fmt_yyyyMMdd_HHmmss(), dump_src, dump_trg_zip.OwnerDir()); IoEngine_xrg_downloadFil download_wkr = app.Wmf_mgr().Download_wkr().Download_xrg(); download_wkr.Src_last_modified_query_(false).Init(dump_src, dump_trg_zip); if (!download_wkr.Exec()) usr_dlg.Warn_many("", "", "download failed: src=~{0} trg=~{1} err=~{2}", dump_src, dump_trg_zip.Raw(), Err_.Message_gplx_full(download_wkr.Rslt_err())); - if (unzip) { + if (unzip) { // parsing unzipped file is faster, but takes up more storage space usr_dlg.Note_many("", "", "unzipping file: now=~{0} trg=~{1}", DateAdp_.Now().XtoStr_fmt_yyyyMMdd_HHmmss(), dump_trg_bin.Raw()); Xob_unzip_wkr unzip_wkr = new Xob_unzip_wkr().Init(app).Process_run_mode_(Process_adp.Run_mode_sync_block); unzip_wkr.Decompress(dump_trg_zip, dump_trg_bin); } } - public void Cmd_end() {} - public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (String_.Eq(k, Invk_dump_date_)) dump_date = m.ReadStr("v"); else if (String_.Eq(k, Invk_dump_type_)) dump_type = m.ReadStr("v"); - else if (String_.Eq(k, Invk_unzip_)) unzip = m.ReadYn("v"); else if (String_.Eq(k, Invk_dump_src_)) dump_src = m.ReadStr("v"); else if (String_.Eq(k, Invk_dump_trg_zip_)) dump_trg_zip = m.ReadIoUrl("v"); else if (String_.Eq(k, Invk_dump_trg_bin_)) dump_trg_bin = m.ReadIoUrl("v"); + else if (String_.Eq(k, Invk_unzip_)) unzip = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_dump_date_ = "dump_date_", Invk_dump_type_ = "dump_type_", Invk_unzip_ = "unzip_" - , Invk_dump_src_ = "dump_src_", Invk_dump_trg_zip_ = "dump_trg_zip_", Invk_dump_trg_bin_ = "dump_trg_bin_" - ; + , Invk_dump_src_ = "dump_src_", Invk_dump_trg_zip_ = "dump_trg_zip_", Invk_dump_trg_bin_ = "dump_trg_bin_"; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java index 5bbb91791..5d2860790 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java @@ -26,7 +26,7 @@ public class Xob_exec_sql_cmd implements Xob_cmd { wiki.Init_assert(); // force load; needed to pick up MediaWiki ns for MediaWiki:mainpage Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); Xowd_db_mgr fsys_mgr = db_mgr.Core_data_mgr(); - Xowd_db_file file = fsys_mgr.Dbs__get_at(file_idx); + Xowd_db_file file = fsys_mgr.Dbs__get_by_id(file_idx); app.Usr_dlg().Plog_many("", "", "exec_sql: running sql; file_idx=~{0} sql=~{1}", file_idx, sql); file.Conn().Exec_sql(sql); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java index 70322296e..4c3a04a61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java @@ -21,7 +21,7 @@ import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.xowa.bldrs.wms.sites.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.apps.site_cfgs.*; public class Xob_site_meta_cmd implements Xob_cmd { - private final Xob_bldr bldr; + private final Xob_bldr bldr; private String[] wikis; private Io_url db_url; private DateAdp cutoff_time; public Xob_site_meta_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.bldr = bldr;} public String Cmd_key() {return Xob_cmd_keys.Key_site_meta;} 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 f7c49afb8..6d04dadbe 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 @@ -32,12 +32,11 @@ public class Xob_image_cmd extends Xob_itm_dump_base implements Xob_cmd, GfoInvk wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql Init_dump(Xob_cmd_keys.Key_wiki_image); if (src_fil == null) { - src_fil = Xobd_rdr.Find_fil_by(wiki.Fsys_mgr().Root_dir(), "*-image.sql"); + src_fil = Xob_page_wkr_cmd.Find_fil_by(wiki.Fsys_mgr().Root_dir(), "*-image.sql"); if (src_fil == null) throw Err_.new_wo_type(".sql file not found in dir", "dir", wiki.Fsys_mgr().Root_dir()); } parser.Src_fil_(src_fil).Trg_fil_gen_(dump_url_gen).Fld_cmd_(this).Flds_req_idx_(20, Fld_img_name, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_media_type, Fld_img_minor_mime, Fld_img_timestamp); - - this.conn = Xob_db_file.new__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); + this.conn = Xob_db_file.New__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); conn.Txn_bgn("bldr__image"); this.tbl_image = new Xob_image_tbl(); tbl_image.Create_table(conn); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java index 496b6409f..ec7f29bd7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import org.junit.*; import gplx.core.ios.*; import gplx.xowa.files.*; -public class Xob_image_cmd_tst { +public class Xob_image_cmd_tst { private Xob_image_cmd_fxt fxt = new Xob_image_cmd_fxt(); @Test public void Basic() {fxt.Init_("A.png" , Xof_media_type.Name_bitmap , Xof_ext_.Bry_png, 220, 110) .Test(Xof_ext_.Id_png);} // A.png -> png @Test public void Ogg_VIDEO() {fxt.Init_("A.ogg" , Xof_media_type.Name_video , Xof_ext_.Bry_ogg, 220, 110) .Test(Xof_ext_.Id_ogv);} // A.ogg and VIDEO -> ogv diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java index 5737e8a3b..cec4bf866 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java @@ -31,7 +31,7 @@ public class Xob_page_dump_cmd_drop extends Xob_itm_basic_base implements Xob_cm case Xowd_db_file_.Tid_wiki_solo: case Xowd_db_file_.Tid_text_solo: case Xowd_db_file_.Tid_text: - db_file.Conn().Ddl_delete_tbl(Xobd_page_dump_tbl.Tbl_name); + db_file.Conn().Meta_tbl_drop(Xobd_page_dump_tbl.Tbl_name); break; } } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java index fd5c58e20..7f727cd71 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java @@ -29,12 +29,11 @@ class Xobd_page_dump_tbl { this.fld_is_redirect = flds.Add_int("page_is_redirect"); } public void Create_data(Io_url page_db_url, int text_db_id) { - conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds)); + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(Tbl_name, flds)); conn.Stmt_delete(Tbl_name).Exec_delete(); // always clear tables again; allows commands to be rerun; DATE:2015-08-04 - Db_attach_cmd.new_(conn, "page_db", page_db_url) - .Add_fmt("text_db_prep.clone_page", Sql_insert_data, text_db_id) - .Exec(); - conn.Ddl_create_idx(Dbmeta_idx_itm.new_unique_by_tbl(Tbl_name, "main", fld_id, fld_namespace, fld_is_redirect, fld_title)); + new Db_attach_mgr(conn, new Db_attach_itm("page_db", page_db_url)) + .Exec_sql_w_msg("text_db_prep.clone_page", Sql_insert_data, text_db_id); + conn.Meta_idx_create(Dbmeta_idx_itm.new_unique_by_tbl(Tbl_name, "main", fld_id, fld_namespace, fld_is_redirect, fld_title)); } private static final String Sql_insert_data = String_.Concat_lines_nl ( "INSERT INTO page_dump (page_id, page_title, page_namespace, page_is_redirect)" @@ -42,7 +41,7 @@ class Xobd_page_dump_tbl { , ", p.page_title" , ", p.page_namespace" , ", p.page_is_redirect" - , "FROM page p" + , "FROM page p" , "WHERE p.page_text_db_id = {0};" ); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java index fa8ccd926..f544f9305 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java @@ -21,7 +21,7 @@ import gplx.langs.htmls.encoders.*; public class Xob_redirect_tbl { private Gfo_url_encoder encoder; private Db_stmt insert_stmt; public Xob_redirect_tbl(Io_url root_dir, Gfo_url_encoder encoder) { - this.db_file = Xob_db_file.new__wiki_redirect(root_dir); + this.db_file = Xob_db_file.New__wiki_redirect(root_dir); this.conn = db_file.Conn(); this.encoder = encoder; } @@ -74,7 +74,7 @@ public class Xob_redirect_tbl { private static final String Fld_src_id = "src_id", Fld_src_ttl = "src_ttl", Fld_trg_id = "trg_id", Fld_trg_ns = "trg_ns", Fld_trg_ttl = "trg_ttl", Fld_trg_anchor = "trg_anchor" , Fld_trg_is_redirect = "trg_is_redirect", Fld_redirect_count = "redirect_count"; - private static final String Tbl_sql = String_.Concat_lines_nl + private static final String Tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS redirect" , "( src_id integer NOT NULL PRIMARY KEY" , ", src_ttl varchar(255) NOT NULL" @@ -86,15 +86,15 @@ public class Xob_redirect_tbl { , ", redirect_count integer NOT NULL" , ");" ); - private static final Db_idx_itm + private static final Db_idx_itm Idx_trg_ttl = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS redirect__trg_ttl ON redirect (trg_ttl);") , Idx_trg_id = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS redirect__trg_id ON redirect (trg_id);") , Idx_trg_src = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS redirect__trg_src ON redirect (src_id, trg_id);") ; -// public static final String +// public static final String // Sql_ddl__page_redirect_id = "ALTER TABLE page ADD COLUMN page_redirect_id integer NOT NULL DEFAULT '-1'" // ; - private static final String + private static final String Sql_get_page_data = String_.Concat_lines_nl // get data from page table for initial redirect dump ( "REPLACE INTO redirect " , "SELECT t.src_id" @@ -147,7 +147,7 @@ public class Xob_redirect_tbl { ) , Sql_update_redirect_id = String_.Concat_lines_nl_skip_last ( "REPLACE INTO" - , " page_db.page" + , " page_db.page (page_id, page_namespace, page_title, page_is_redirect, page_touched, page_len, page_random_int, page_text_db_id, page_html_db_id, page_redirect_id, page_score)" , "SELECT p.page_id" , ", p.page_namespace" , ", p.page_title" @@ -158,6 +158,7 @@ public class Xob_redirect_tbl { , ", p.page_text_db_id" , ", p.page_html_db_id" , ", r.trg_id" + , ", p.page_score" , "FROM redirect r" , " JOIN page_db.page p ON r.src_id = p.page_id" ) 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 e7f209c93..57754501b 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 @@ -70,7 +70,6 @@ class Xob_url_fixer_tkn { public byte[] Raw() {return raw;} private byte[] raw; public int Raw_len() {return raw_len;} private int raw_len; public static Xob_url_fixer_tkn new_(int tid, String raw) {return new Xob_url_fixer_tkn(tid, Bry_.new_u8(raw));} - private static void trie_add(Btrie_slim_mgr trie, int tid, String s) {trie.Add_obj(s, new_(tid, s));} public static final int Tid_bgn_slash_1 = 1, Tid_bgn_slash_2 = 2, Tid_bgn_http = 3, Tid_bgn_https = 4; private static Btrie_slim_mgr bgn_trie; diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java index f443d3e85..867313783 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java @@ -55,7 +55,7 @@ class Dg_file_tbl { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "file_id", fld_file_id) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } stmt_insert = null; } @@ -83,7 +83,7 @@ class Dg_rule_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_rule_id) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } conn.Rls_reg(this); } @@ -119,7 +119,7 @@ class Dg_page_score_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } stmt_insert = null; conn.Rls_reg(this); @@ -155,7 +155,7 @@ class Dg_page_rule_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id, fld_rule_id) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } stmt_insert = null; conn.Rls_reg(this); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java index 16c849bb6..48fb93b19 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java @@ -103,11 +103,11 @@ class Xoi_cmd_search2_build extends Xoi_cmd_base { @Override public void Process_async_init(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { if (app.Setup_mgr().Dump_mgr().Wiki_storage_type_is_sql()) { wiki.Db_mgr_as_sql().Category_version_update(false); - bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_text_search_cmd); + gplx.xowa.addons.searchs.dbs.bldrs.Srch_bldr_mgr_.Setup(wiki); } } @Override public void Process_async_done(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { app.Usr_dlg().Prog_many("", "", "search2 setup done"); - wiki.Db_mgr().Search_version_refresh(); + // wiki.Db_mgr().Search_version_refresh(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java index 95e711b66..939dd000e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java @@ -50,7 +50,7 @@ public class Xoi_cmd_mgr implements GfoInvkAble { private void Run_async(Gfo_thread_cmd cmd) {Thread_adp_.invk_msg_(cmd.Async_key(), this, GfoMsg_.new_cast_(Invk_process_async).Add("v", cmd)).Start();} private void Cmds_run() { if (working) { - app.Gui_mgr().Kit().Ask_ok("", "", "An import is in progress. Please wait for it to complete. If you want to do multiple imports at once, see Help:Import/Script."); + app.Gui_mgr().Kit().Ask_ok("", "", "An import is in progress. Please wait for it to complete. If you want to do multiple imports at once, see Dashboard/Import/Offline."); // HOME return; } int cmds_len = cmds.Count(); @@ -75,7 +75,7 @@ public class Xoi_cmd_mgr implements GfoInvkAble { String dump_type = m.Args_getAt(2).Val_to_str_or_empty(); Gfo_thread_cmd cmd = null; for (int i = 3; i < args_len; i++) { - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); String kv_val = kv.Val_to_str_or_empty(); if (String_.Eq(kv_val, Wiki_cmd_custom)) return Dump_add_many_custom(wiki_key, wiki_date, dump_type, false); @@ -117,8 +117,8 @@ public class Xoi_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xoi_cmd_search2_build.KEY)) return new Xoi_cmd_search2_build(install_mgr, wiki_key).Owner_(this); else throw Err_.new_unhandled(cmd_key); } - public static final String[] Wiki_cmds_valid = new String[] {Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_unzip.KEY_dump, Xoi_cmd_wiki_import.KEY, Xoi_cmd_wiki_zip.KEY, Xoi_cmd_category2_build.KEY, Xoi_cmd_category2_page_props.KEY_category2, Xoi_cmd_category2_categorylinks.KEY_category2}; - public static final String Wiki_cmd_custom = "wiki.custom", Wiki_cmd_dump_file = "wiki.dump_file"; + public static final String[] Wiki_cmds_valid = new String[] {Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_unzip.KEY_dump, Xoi_cmd_wiki_import.KEY, Xoi_cmd_wiki_zip.KEY, Xoi_cmd_category2_build.KEY, Xoi_cmd_category2_page_props.KEY_category2, Xoi_cmd_category2_categorylinks.KEY_category2}; + public static final String Wiki_cmd_custom = "wiki.custom", Wiki_cmd_dump_file = "wiki.dump_file"; public Gfo_thread_cmd Cmd_add(GfoMsg m) {Gfo_thread_cmd rv = Cmd_new(m); cmds.Add(rv); return rv;} Gfo_thread_cmd Cmd_new(GfoMsg m) { String cmd_key = m.ReadStr("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java index 642d63115..71be03c68 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java @@ -64,8 +64,8 @@ class Xoi_cmd_wiki_import implements Gfo_thread_cmd { bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_core); bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_link); } - if (wiki.Appe().Setup_mgr().Dump_mgr().Search_version() == gplx.xowa.specials.search.Xows_page__search.Version_2) - bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_search_wkr); + if (wiki.Appe().Setup_mgr().Dump_mgr().Search_version() == gplx.xowa.addons.searchs.specials.Srch_special_page.Version_2) + gplx.xowa.addons.searchs.dbs.bldrs.Srch_bldr_mgr_.Setup(wiki); bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_term); } private void Process_async() { diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_tst.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_tst.java index dac07c253..f20c5de5c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_tst.java @@ -33,7 +33,7 @@ public class Xoi_cmd_wiki_tst { Bfr_arg__time time_fmtr = new Bfr_arg__time(); for (int i = 0; i < ary_len; i++) Bld_import_list_itm2(bfr, parser, time_fmtr, ary, i); - Io_mgr.Instance.SaveFilStr("C:\\temp.txt", bfr.To_str()); + Io_mgr.Instance.SaveFilStr("C:\\xowa\\user\\temp.txt", bfr.To_str()); } private void Bld_import_list_itm2(Bry_bfr bfr, Wmf_latest_parser parser, Bfr_arg__time time_fmtr, String[] ary, int i) { String domain_str = ary[i]; @@ -124,6 +124,6 @@ public class Xoi_cmd_wiki_tst { } } bfr.Add_str_a7("app.bldr.wiki_cfg_bldr.run;").Add_byte_nl(); - Io_mgr.Instance.SaveFilStr("C:\\xowa_build_cfg.gfs", bfr.To_str()); + Io_mgr.Instance.SaveFilStr("C:\\user\\xowa_build_cfg.gfs", bfr.To_str()); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java index de9c912b8..4da44a888 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java @@ -31,7 +31,7 @@ public class Xoi_dump_mgr implements GfoInvkAble { public boolean Css_wiki_update() {return css_wiki_update;} private boolean css_wiki_update = true; public boolean Css_commons_download() {return css_commons_download;} private boolean css_commons_download = true; // changed from false to true; DATE:2014-10-19 public boolean Delete_xml_file() {return delete_xml_file;} private boolean delete_xml_file = true; - public byte Search_version() {return search_version;} private byte search_version = gplx.xowa.specials.search.Xows_page__search.Version_2; + public byte Search_version() {return search_version;} private byte search_version = gplx.xowa.addons.searchs.specials.Srch_special_page.Version_2; public boolean Import_bz2_by_stdout() {return import_bz2_by_stdout;} private boolean import_bz2_by_stdout = true; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_server_urls)) return String_.Concat_with_str(",\n", server_urls); @@ -77,9 +77,9 @@ public class Xoi_dump_mgr implements GfoInvkAble { , Invk_search_version = "search_version", Invk_search_version_ = "search_version_", Invk_search_version_list = "search_version_list" , Invk_import_bz2_by_stdout = "import_bz2_by_stdout", Invk_import_bz2_by_stdout_ = "import_bz2_by_stdout_" ; - private static KeyVal[] Options_data_storage_format_list = KeyVal_.Ary(KeyVal_.new_(".xdat", "text"), KeyVal_.new_(".gz", "gzip"), KeyVal_.new_(".bz2", "bzip2")); // removed .zip; DATE:2014-05-13; updated aliases; DATE:2014-06-20 + private static Keyval[] Options_data_storage_format_list = Keyval_.Ary(Keyval_.new_(".xdat", "text"), Keyval_.new_(".gz", "gzip"), Keyval_.new_(".bz2", "bzip2")); // removed .zip; DATE:2014-05-13; updated aliases; DATE:2014-06-20 static final byte Wiki_storage_type_xdat = 1, Wiki_storage_type_sqlite = 2; - private static final KeyVal[] Options_storage_type_list = KeyVal_.Ary(KeyVal_.new_("sqlite"), KeyVal_.new_("xdat")); // DEPRECATED: KeyVal_.new_("xdat"); DATE:2015-03-30 + private static final Keyval[] Options_storage_type_list = Keyval_.Ary(Keyval_.new_("sqlite"), Keyval_.new_("xdat")); // DEPRECATED: Keyval_.new_("xdat"); DATE:2015-03-30 public static String Wiki_storage_type_str(byte v) { switch (v) { case Xoi_dump_mgr.Wiki_storage_type_xdat : return "xdat"; @@ -92,7 +92,7 @@ public class Xoi_dump_mgr implements GfoInvkAble { else if (String_.Eq(v, "sqlite")) return Xoi_dump_mgr.Wiki_storage_type_sqlite; else throw Err_.new_unhandled(v); } - private static final KeyVal[] Options_search_version_list = KeyVal_.Ary(KeyVal_.new_("1"), KeyVal_.new_("2")); + private static final Keyval[] Options_search_version_list = Keyval_.Ary(Keyval_.new_("1"), Keyval_.new_("2")); public static String Options_search_version_str(byte v) {return Byte_.To_str(v);} public static byte Options_search_version_parse(String v) {return Byte_.parse(v);} } diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xow_cfg_wiki_core_tst.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xow_cfg_wiki_core_tst.java index 65fadda0e..eac2fa11c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xow_cfg_wiki_core_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xow_cfg_wiki_core_tst.java @@ -84,8 +84,8 @@ class Xow_cfg_wiki_core_fxt { Xoae_app app; Xowe_wiki wiki; public Xowe_wiki Wiki() {return wiki;} public void Clear() { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); } public void Save_tst(String bldr_version, String main_page, String siteinfo_misc, int ns_user_case_match, String ns_user_name, String expd) { wiki.Props().Bldr_version_(Bry_.new_a7(bldr_version)).Main_page_(Bry_.new_a7(main_page)).Siteinfo_misc_(Bry_.new_a7(siteinfo_misc)); diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_itm.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_itm.java index 2d9bde967..77dd905a5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_itm.java @@ -34,4 +34,4 @@ public class Wmf_dump_itm implements gplx.CompareAble { public int compareTo(Object obj) {Wmf_dump_itm comp = (Wmf_dump_itm)obj; return Bry_.Compare(wiki_abrv, comp.wiki_abrv);} private static byte[] Status_msg_dump_complete = Bry_.new_a7("Dump complete"), Status_msg_dump_in_progress = Bry_.new_a7("Dump in progress"); public static final byte Status_tid_complete = 0, Status_tid_working = 1, Status_tid_error = 2; -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser.java index 8ebfc07e4..d1bcd811e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser.java @@ -41,7 +41,9 @@ public class Wmf_dump_list_parser { byte[] href_bry = Bry_.Mid(src, href_bgn_pos + 1, href_end_pos); int date_end = href_bry.length; int date_bgn = Bry_find_.Find_bwd(href_bry, Byte_ascii.Slash); if (date_bgn == Bry_find_.Not_found) return false; - byte[] date_bry = Bry_.Mid(href_bry, date_bgn + 1, date_end); + byte[] date_bry = Bry_.Mid(href_bry, date_bgn + 1, date_end); if (date_bry.length == 0) return false; // anchors like "/other_static_dumps" should be skipped + if (Bry_.Has(date_bry, Bry_.new_u8("legal.html"))) return false; + if (Bry_.Has(date_bry, Bry_.new_u8("Privacy_policy"))) return false; DateAdp date = DateAdp_.parse_fmt(String_.new_a7(date_bry), "yyyyMMdd"); itm.Dump_date_(date); int abrv_end = date_bgn; diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser_tst.java index 3f1f398a6..74ab2b5c9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_dump_list_parser_tst.java @@ -41,7 +41,7 @@ public class Wmf_dump_list_parser_tst { , fxt.itm("zh-classicalwiki", "20131128", Wmf_dump_itm.Status_tid_complete, "Dump complete", "2013-11-28 06:08:56") ); } -// @Test public void Update() { // MAINT:QUARTERLY:2015-08-23; must run C:\xowa\ and update dump status +// @Test public void Update() { // MAINT:QUARTERLY:2016-03-17; must run C:\xowa\ and update dump status // 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" @@ -80,7 +80,7 @@ public class Wmf_dump_list_parser_tst { // .Add_byte(Byte_ascii.Apos) // .Add_byte(Byte_ascii.Paren_end) // .Add_byte(Byte_ascii.Comma) -// .Add_str("--" + String_.new_u8(abrv)) +// .Add_str_u8("--" + String_.new_u8(abrv)) // .Add_byte_nl() // ; // bld_bfr @@ -92,7 +92,7 @@ public class Wmf_dump_list_parser_tst { // .Add_byte_nl() // ; // } -// Io_url temp = Io_url_.new_fil_("C:\\import_update.txt"); +// Io_url temp = Io_url_.new_fil_("C:\\xowa\\user\\import_update.txt"); // Io_mgr.Instance.SaveFilBfr(temp, sql_bfr); //// Io_mgr.Instance.AppendFilBfr(temp, bld_bfr); // } diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_latest_itm.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_latest_itm.java index ca57f0f85..eadcb3d77 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_latest_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Wmf_latest_itm.java @@ -23,4 +23,4 @@ public class Wmf_latest_itm { public byte[] Name() {return name;} private final byte[] name; public DateAdp Date() {return date;} private final DateAdp date; public long Size() {return size;} private final long size; -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xow_maint_mgr.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xow_maint_mgr.java index 350501bf4..981beba7f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xow_maint_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xow_maint_mgr.java @@ -34,6 +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) + if (this.Wmf_dump_date() == null) return false; // also null if custom wiki 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) { diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Upgrader_v00_02_01_tst.java b/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Upgrader_v00_02_01_tst.java index d027b0d88..9718c2891 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Upgrader_v00_02_01_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Upgrader_v00_02_01_tst.java @@ -19,8 +19,8 @@ package gplx.xowa.bldrs.setups.upgrades; import gplx.*; import gplx.xowa.*; impo import org.junit.*; import gplx.xowa.bldrs.installs.*; public class Upgrader_v00_02_01_tst { @Test public void Run() { - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); Io_url cfg_dir = wiki.Fsys_mgr().Root_dir().GenSubDir("cfg"); Io_mgr.Instance.SaveFilStr(cfg_dir.GenSubFil("siteInfo.xml"), Str_siteinfo_xml); Io_mgr.Instance.SaveFilStr(cfg_dir.GenSubFil("wiki.gfs"), Str_wikistats_gfs); diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Xoa_upgrade_mgr_tst.java b/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Xoa_upgrade_mgr_tst.java index 651fc0a1b..053ca7ee2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Xoa_upgrade_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/upgrades/Xoa_upgrade_mgr_tst.java @@ -19,7 +19,7 @@ package gplx.xowa.bldrs.setups.upgrades; import gplx.*; import gplx.xowa.*; impo import org.junit.*; public class Xoa_upgrade_mgr_tst { @Test public void Run() { - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); Io_url old_history_dir = app.Usere().Fsys_mgr().App_data_dir(); Io_url new_history_dir = app.Usere().Fsys_mgr().App_data_dir().GenSubDir("history"); Io_mgr.Instance.SaveFilStr(old_history_dir.GenSubFil("page_history.csv"), "test"); diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java index d6addc149..ac88867d0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java @@ -97,7 +97,7 @@ class Xoi_wiki_props_fxt { class Xob_subpage_tst_fxt { public Xob_subpage_tst_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); mgr = app.Bldr().Wiki_cfg_bldr(); } mgr.Clear(); @@ -110,7 +110,7 @@ class Xob_subpage_tst_fxt { return this; } public Xob_subpage_tst_fxt Expd_txt(String wiki, String text) { -// hash.Add(wiki, KeyVal_.new_(wiki, text)); +// hash.Add(wiki, Keyval_.new_(wiki, text)); return this; } private String_bldr sb = String_bldr_.new_(); diff --git a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_cmd__base.java b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_cmd__base.java new file mode 100644 index 000000000..7aee88422 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_cmd__base.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +public abstract class Xob_cmd__base implements GfoInvkAble { + protected final Xoae_app app; protected final Xob_bldr bldr; protected final Xowe_wiki wiki; protected final Gfo_usr_dlg usr_dlg; + public Xob_cmd__base(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.app = bldr.App(); usr_dlg = bldr.Usr_dlg();} + public abstract String Cmd_key(); + public abstract void Cmd_run(); + @gplx.Virtual public void Cmd_init(Xob_bldr bldr) {} + @gplx.Virtual public void Cmd_bgn(Xob_bldr bldr) {} + @gplx.Virtual public void Cmd_end() {} + @gplx.Virtual public void Cmd_term() {} + public abstract Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m); +} diff --git a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_idx_base.java b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_idx_base.java index b0211cbe9..126d8f184 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_idx_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_idx_base.java @@ -36,4 +36,4 @@ public abstract class Xob_idx_base extends Xob_itm_basic_base implements Xob_cmd Io_url[] fils = Io_mgr.Instance.QueryDir_fils(dir); return new Io_line_rdr(bldr.Usr_dlg(), fils).Key_gen_(Io_line_rdr_key_gen_.first_pipe); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_itm_basic_base.java b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_itm_basic_base.java index beb98be25..469b83c94 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_itm_basic_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_itm_basic_base.java @@ -19,8 +19,7 @@ package gplx.xowa.bldrs.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xow public abstract class Xob_itm_basic_base implements GfoInvkAble { protected Xoae_app app; protected Xob_bldr bldr; protected Xowe_wiki wiki; protected Gfo_usr_dlg usr_dlg; public void Cmd_ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.app = bldr.App(); usr_dlg = bldr.Usr_dlg(); this.Cmd_ctor_end(bldr, wiki);} - @gplx.Virtual protected void Cmd_ctor_end(Xob_bldr bldr, Xowe_wiki wiki) { - } + @gplx.Virtual protected void Cmd_ctor_end(Xob_bldr bldr, Xowe_wiki wiki) {} @gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_owner)) return bldr.Cmd_mgr(); else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_sql_dump_base.java b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_sql_dump_base.java index ad7293044..fccecb9d6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_sql_dump_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/wkrs/Xob_sql_dump_base.java @@ -19,7 +19,7 @@ package gplx.xowa.bldrs.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.core.flds.*; import gplx.core.ios.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.bldrs.sqls.*; import gplx.xowa.wikis.tdbs.bldrs.*; public abstract class Xob_sql_dump_base extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble { - private final Sql_file_parser parser = new Sql_file_parser(); private boolean fail = false; + private final Sql_file_parser parser = new Sql_file_parser(); protected boolean fail = false; public abstract String Cmd_key(); public Io_url Src_fil() {return src_fil;} private Io_url src_fil; public Io_url_gen Make_url_gen() {return make_url_gen;} private Io_url_gen make_url_gen; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java index c1b9540d2..5487037f2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/apis/Xoapi_orig_base_tst.java @@ -39,8 +39,8 @@ public class Xoapi_orig_base_tst { class Xoapi_orig_base_fxt { private Xoae_app app; private Xowe_wiki wiki; private Xoapi_orig_rslts rv = new Xoapi_orig_rslts(); public void Clear() { - this.app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); + this.app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); } public void Bld_api_url_tst(String ttl_str, int w, int h, String expd) { String actl = Xoapi_orig_wmf.Bld_api_url(wiki.Domain_bry(), Bry_.new_u8(ttl_str), w, h); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_file.java b/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_file.java index b2ba657ae..0aa45bd61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_file.java @@ -91,7 +91,7 @@ public class Xowm_dump_file { int dump_type_int = Xowm_dump_type_.parse_by_file(dump_type_bry); byte[] dump_file_ext = Xowm_dump_file_.Ext_xml_bz2; switch (dump_type_int) { - case Xowm_dump_type_.Int__page_props: case Xowm_dump_type_.Int__categorylinks: case Xowm_dump_type_.Int__image: + case Xowm_dump_type_.Int__page_props: case Xowm_dump_type_.Int__categorylinks: case Xowm_dump_type_.Int__image: case Xowm_dump_type_.Int__pagelinks: dump_file_ext = Xowm_dump_file_.Ext_sql_gz; break; } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_type_.java b/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_type_.java index 3719204c3..8128d30ac 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_type_.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/dumps/Xowm_dump_type_.java @@ -23,9 +23,9 @@ public class Xowm_dump_type_ { Object o = regy.Match_bgn(src, bgn, end); if (o == null) throw Err_.new_("wm.dump", "unknown dump file type", "src", src); return ((Int_obj_val)o).Val(); } - public static final int Int__pages_articles = 1, Int__pages_meta_current = 2, Int__categorylinks = 3, Int__page_props = 4, Int__image = 5; + public static final int Int__pages_articles = 1, Int__pages_meta_current = 2, Int__categorylinks = 3, Int__page_props = 4, Int__image = 5, Int__pagelinks = 6; public static final String Str__pages_articles = "pages-articles", Str__pages_meta_current = "pages-meta-current" - , Str__categorylinks = "categorylinks", Str__page_props = "page_props", Str__image = "image" + , Str__categorylinks = "categorylinks", Str__page_props = "page_props", Str__image = "image", Str__pagelinks = "pagelinks" ; private static final Btrie_slim_mgr regy = Btrie_slim_mgr.ci_a7() .Add_str_int(Str__pages_articles , Int__pages_articles) @@ -33,6 +33,7 @@ public class Xowm_dump_type_ { .Add_str_int(Str__categorylinks , Int__categorylinks) .Add_str_int(Str__page_props , Int__page_props) .Add_str_int(Str__image , Int__image) + .Add_str_int(Str__pagelinks , Int__pagelinks) ; public static String To_str(byte v) { switch (v) { @@ -41,6 +42,7 @@ public class Xowm_dump_type_ { case Int__categorylinks : return Str__categorylinks; case Int__page_props : return Str__page_props; case Int__image : return Str__image; + case Int__pagelinks : return Str__pagelinks; default : throw Err_.new_unhandled(v); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_db.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_db.java index 89b7ce75c..376adfa8a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_db.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_db.java @@ -21,24 +21,24 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.bldrs.*; public class Site_core_db { private Db_conn conn; - private final Site_core_tbl tbl__core; - private final Site_kv_tbl tbl__general; - private final Site_namespace_tbl tbl__namespace; - private final Site_statistic_tbl tbl__statistic; - private final Site_interwikimap_tbl tbl__interwikimap; - private final Site_namespacealias_tbl tbl__namespacealias; - private final Site_specialpagealias_tbl tbl__specialpagealias; - private final Site_library_tbl tbl__library; - private final Site_extension_tbl tbl__extension; - private final Site_skin_tbl tbl__skin; - private final Site_magicword_tbl tbl__magicword; - private final Site_val_tbl tbl__functionhook; - private final Site_showhook_tbl tbl__showhook; - private final Site_val_tbl tbl__extensiontag; - private final Site_val_tbl tbl__protocol; - private final Site_kv_tbl tbl__defaultoption; - private final Site_language_tbl tbl__language; - private final Db_tbl[] tbl_ary; + private final Site_core_tbl tbl__core; + private final Site_kv_tbl tbl__general; + private final Site_namespace_tbl tbl__namespace; + private final Site_statistic_tbl tbl__statistic; + private final Site_interwikimap_tbl tbl__interwikimap; + private final Site_namespacealias_tbl tbl__namespacealias; + private final Site_specialpagealias_tbl tbl__specialpagealias; + private final Site_library_tbl tbl__library; + private final Site_extension_tbl tbl__extension; + private final Site_skin_tbl tbl__skin; + private final Site_magicword_tbl tbl__magicword; + private final Site_val_tbl tbl__functionhook; + private final Site_showhook_tbl tbl__showhook; + private final Site_val_tbl tbl__extensiontag; + private final Site_val_tbl tbl__protocol; + private final Site_kv_tbl tbl__defaultoption; + private final Site_language_tbl tbl__language; + private final Db_tbl[] tbl_ary; public Site_core_db(Io_url db_url) { Db_conn_bldr_data conn_data = Db_conn_bldr.Instance.Get_or_new(db_url); this.conn = conn_data.Conn(); boolean created = conn_data.Created(); @@ -120,7 +120,7 @@ public class Site_core_db { int len = hash.Count(); for (int i = 0; i < len; ++i) { Site_interwikimap_itm itm = (Site_interwikimap_itm)hash.Get_at(i); - Xow_xwiki_itm xwiki_itm = Xow_xwiki_itm_bldr.Instance.Bld_mw(domain_itm, itm.Prefix(), itm.Url(), null); + Xow_xwiki_itm xwiki_itm = Xow_xwiki_itm_bldr.Instance.Bld_mw(domain_itm, itm.Prefix, itm.Url, null); xwiki_mgr.Add_itm(xwiki_itm); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java index 203819cc7..f5cb4bc0f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java @@ -32,7 +32,7 @@ public class Site_core_tbl implements Db_tbl { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java index 6066bdcc5..056e6a6eb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java @@ -43,7 +43,7 @@ class Site_extension_tbl implements Db_tbl { this.fld_credits = flds.Add_str("credits", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_type, fld_name)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_type, fld_name)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_itm.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_itm.java index 9ce1c03e4..f74f61e7f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_itm.java @@ -17,19 +17,27 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; class Site_interwikimap_itm implements To_str_able { - public Site_interwikimap_itm(byte[] prefix, boolean local, byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { - this.prefix = prefix; - this.local = local; - this.language = language; - this.localinterwiki = localinterwiki; - this.url = url; - this.protorel = protorel; + public Site_interwikimap_itm(byte[] prefix, boolean local + , boolean extralanglink, byte[] linktext, byte[] sitename + , byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { + this.Prefix = prefix; + this.Local = local; + this.Extralanglink = extralanglink; + this.Linktext = linktext; + this.Sitename = sitename; + this.Language = language; + this.Localinterwiki = localinterwiki; + this.Url = url; + this.Protorel = protorel; } - public byte[] Prefix() {return prefix;} private final byte[] prefix; - public boolean Local() {return local;} private final boolean local; - public byte[] Language() {return language;} private final byte[] language; - public boolean Localinterwiki() {return localinterwiki;} private final boolean localinterwiki; - public byte[] Url() {return url;} private final byte[] url; - public boolean Protorel() {return protorel;} private final boolean protorel; - public String To_str() {return String_.Concat_with_obj("|", prefix, local, language, url, protorel);} + public final byte[] Prefix; + public final boolean Local; + public final boolean Extralanglink; + public final byte[] Linktext; + public final byte[] Sitename; + public final byte[] Language; + public final boolean Localinterwiki; + public final byte[] Url; + public final boolean Protorel; + public String To_str() {return String_.Concat_with_obj("|", Prefix, Local, Extralanglink, Linktext, Sitename, Language, Localinterwiki, Url, Protorel);} } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java index 564e8f610..efec497f8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java @@ -18,22 +18,25 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_interwikimap_tbl implements Db_tbl { - private static final String tbl_name = "site_interwikimap"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); - private final String fld_site_abrv, fld_prefix, fld_local, fld_language, fld_localinterwiki, fld_url, fld_protorel; - private final Db_conn conn; + private static final String tbl_name = "site_interwikimap"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private final String fld_site_abrv, fld_prefix, fld_local, fld_extralanglink, fld_linktext, fld_sitename, fld_language, fld_localinterwiki, fld_url, fld_protorel; + private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; public Site_interwikimap_tbl(Db_conn conn) { this.conn = conn; this.fld_site_abrv = flds.Add_str("site_abrv", 255); this.fld_prefix = flds.Add_str("prefix", 255); this.fld_local = flds.Add_bool("local"); + this.fld_extralanglink = flds.Add_bool("extralanglink"); + this.fld_linktext = flds.Add_str("linktext", 255); + this.fld_sitename = flds.Add_str("sitename", 255); this.fld_language = flds.Add_str("language", 255); this.fld_localinterwiki = flds.Add_bool("localinterwiki"); this.fld_url = flds.Add_str("url", 255); this.fld_protorel = flds.Add_bool("protorel"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_prefix)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_prefix)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); @@ -49,12 +52,15 @@ class Site_interwikimap_tbl implements Db_tbl { Site_interwikimap_itm itm = new Site_interwikimap_itm ( rdr.Read_bry_by_str(fld_prefix) , rdr.Read_bool_by_byte(fld_local) + , rdr.Read_bool_by_byte(fld_extralanglink) + , rdr.Read_bry_by_str(fld_linktext) + , rdr.Read_bry_by_str(fld_sitename) , rdr.Read_bry_by_str(fld_language) , rdr.Read_bool_by_byte(fld_localinterwiki) , rdr.Read_bry_by_str(fld_url) , rdr.Read_bool_by_byte(fld_protorel) ); - list.Add(itm.Prefix(), itm); + list.Add(itm.Prefix, itm); } } finally {rdr.Rls();} @@ -66,14 +72,17 @@ class Site_interwikimap_tbl implements Db_tbl { int len = list.Count(); for (int i = 0; i < len; ++i) { Site_interwikimap_itm itm = (Site_interwikimap_itm)list.Get_at(i); - Insert(site_abrv, itm.Prefix(), itm.Local(), itm.Language(), itm.Localinterwiki(), itm.Url(), itm.Protorel()); + Insert(site_abrv, itm.Prefix, itm.Local, itm.Extralanglink, itm.Linktext, itm.Sitename, itm.Language, itm.Localinterwiki, itm.Url, itm.Protorel); } } - private void Insert(byte[] site_abrv, byte[] prefix, boolean local, byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { + private void Insert(byte[] site_abrv, byte[] prefix, boolean local, boolean extralanglink, byte[] linktext, byte[] sitename, byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { stmt_insert.Clear() .Val_bry_as_str(fld_site_abrv , site_abrv) .Val_bry_as_str(fld_prefix , prefix) .Val_bool_as_byte(fld_local , local) + .Val_bool_as_byte(fld_extralanglink , extralanglink) + .Val_bry_as_str(fld_linktext , linktext) + .Val_bry_as_str(fld_sitename , sitename) .Val_bry_as_str(fld_language , language) .Val_bool_as_byte(fld_localinterwiki , localinterwiki) .Val_bry_as_str(fld_url , url) diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_json_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_json_parser_tst.java index d592bb165..fdb1b6b9d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_json_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_json_parser_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import org.junit.*; import gplx.langs.jsons.*; import gplx.xowa.wikis.nss.*; public class Site_json_parser_tst { - private final Site_json_parser_fxt fxt = new Site_json_parser_fxt(); + private final Site_json_parser_fxt fxt = new Site_json_parser_fxt(); @Before public void init() {Gfo_usr_dlg_.Instance = Gfo_usr_dlg_.Test_console();} @After public void term() {Gfo_usr_dlg_.Instance = Gfo_usr_dlg_.Noop;} @Test public void General() { @@ -44,7 +44,7 @@ public class Site_json_parser_tst { , " }" , "}" )); - fxt.Test_general(KeyVal_.new_("mainpage", "Main Page"), KeyVal_.new_("imagewhitelistenabled", ""), KeyVal_.new_("timeoffset", "0"), KeyVal_.new_("thumblimits", "120|150"), KeyVal_.new_("imagelimits", "320=240|640=480")); + fxt.Test_general(Keyval_.new_("mainpage", "Main Page"), Keyval_.new_("imagewhitelistenabled", ""), Keyval_.new_("timeoffset", "0"), Keyval_.new_("thumblimits", "120|150"), Keyval_.new_("imagelimits", "320=240|640=480")); } @Test public void Namespace() { fxt.Exec_parse(String_.Concat_lines_nl_skip_last @@ -114,6 +114,9 @@ public class Site_json_parser_tst { , " }" , " , { 'prefix': 'ar'" , " , 'local': ''" + , " , 'extralanglink': ''" + , " , 'linktext': 'More languages'" + , " , 'sitename': 'Multilingual Wikisource'" , " , 'language': '\u0627\u0644\u0639\u0631\u0628\u064a\u0629'" , " , 'url': 'https://ar.wikipedia.org/wiki/$1'" , " , 'protorel': ''" @@ -122,8 +125,8 @@ public class Site_json_parser_tst { , "}" )); fxt.Test_interwikimap - ( fxt.Make_interwikimap("aquariumwiki" , Bool_.N, null , Bool_.N, "http://www.theaquariumwiki.com/$1" , Bool_.N) - , fxt.Make_interwikimap("ar" , Bool_.Y, "العربية" , Bool_.N, "https://ar.wikipedia.org/wiki/$1" , Bool_.Y) + ( fxt.Make_interwikimap("aquariumwiki" , Bool_.N, Bool_.N, null , null , null , Bool_.N, "http://www.theaquariumwiki.com/$1" , Bool_.N) + , fxt.Make_interwikimap("ar" , Bool_.Y, Bool_.Y, "More languages", "Multilingual Wikisource" , "العربية" , Bool_.N, "https://ar.wikipedia.org/wiki/$1" , Bool_.Y) ); } @Test public void Namespacealias() { @@ -343,7 +346,7 @@ public class Site_json_parser_tst { , " }" , "}" )); - fxt.Test_defaultoption(KeyVal_.new_("globaluserpage", "true"), KeyVal_.new_("cols", "80"), KeyVal_.new_("echo-email-format", "html")); + fxt.Test_defaultoption(Keyval_.new_("globaluserpage", "true"), Keyval_.new_("cols", "80"), Keyval_.new_("echo-email-format", "html")); } @Test public void Language() { fxt.Exec_parse(String_.Concat_lines_nl_skip_last @@ -376,8 +379,8 @@ public class Site_json_parser_tst { // } } class Site_json_parser_fxt { - private final Json_parser json_parser = new Json_parser(); - private final Site_json_parser site_meta_parser; + private final Json_parser json_parser = new Json_parser(); + private final Site_json_parser site_meta_parser; private Site_meta_itm site_meta; public Site_json_parser_fxt() { this.site_meta_parser = new Site_json_parser(json_parser); @@ -391,7 +394,9 @@ class Site_json_parser_fxt { return new Site_namespace_itm(id, case_tid_is_cs ? Xow_ns_case_.Bry__all : Xow_ns_case_.Bry__1st, Bry_.new_u8_safe(canonical), Bry_.new_u8_safe(localized), subpages, content, Bry_.new_u8_safe(defaultcontentmodel)); } public Site_statistic_itm Make_statistic(long pages, long articles, long edits, long images, long users, long activeusers, long admins, long jobs, long queued_massmessages) {return new Site_statistic_itm().Ctor(pages, articles, edits, images, users, activeusers, admins, jobs, queued_massmessages);} - public Site_interwikimap_itm Make_interwikimap(String prefix, boolean local, String language, boolean localinterwiki, String url, boolean protorel) {return new Site_interwikimap_itm(Bry_.new_u8_safe(prefix), local, Bry_.new_u8_safe(language), localinterwiki, Bry_.new_u8_safe(url), protorel);} + public Site_interwikimap_itm Make_interwikimap(String prefix, boolean local, boolean extralanglink, String linktext, String sitename, String language, boolean localinterwiki, String url, boolean protorel) { + return new Site_interwikimap_itm(Bry_.new_u8_safe(prefix), local, extralanglink, Bry_.new_u8_safe(linktext), Bry_.new_u8_safe(sitename), Bry_.new_u8_safe(language), localinterwiki, Bry_.new_u8_safe(url), protorel); + } public Site_namespacealias_itm Make_namespacealias(int id, String alias) {return new Site_namespacealias_itm(id, Bry_.new_u8_safe(alias));} public Site_specialpagealias_itm Make_specialpagealias(String realname, String... aliases) {return new Site_specialpagealias_itm(Bry_.new_u8_safe(realname), Bry_.Ary(aliases));} public Site_library_itm Make_library(String name, String version) {return new Site_library_itm(Bry_.new_u8_safe(name), Bry_.new_u8_safe(version));} @@ -407,7 +412,7 @@ class Site_json_parser_fxt { public Site_magicword_itm Make_magicword(String name, boolean case_match, String... aliases) {return new Site_magicword_itm(Bry_.new_u8_safe(name), case_match, Bry_.Ary(aliases));} public Site_showhook_itm Make_showhook(String name, String scribunto, String... subscribers) {return new Site_showhook_itm(Bry_.new_u8_safe(name), Bry_.new_u8_safe(scribunto), Bry_.Ary(subscribers));} public Site_language_itm Make_language(String code, String name) {return new Site_language_itm(Bry_.new_u8_safe(code), Bry_.new_u8_safe(name));} - public void Test_general(KeyVal... expd) {Tfds.Eq_ary_str(expd, (KeyVal[])site_meta.General_list().To_ary(KeyVal.class));} + public void Test_general(Keyval... expd) {Tfds.Eq_ary_str(expd, (Keyval[])site_meta.General_list().To_ary(Keyval.class));} public void Test_namespace(Site_namespace_itm... expd) {Tfds.Eq_ary_str(expd, (Site_namespace_itm[])site_meta.Namespace_list().To_ary(Site_namespace_itm.class));} public void Test_statistic(Site_statistic_itm expd) {Tfds.Eq_str_intf(expd, site_meta.Statistic_itm());} public void Test_interwikimap(Site_interwikimap_itm... expd) {Tfds.Eq_ary_str(expd, (Site_interwikimap_itm[])site_meta.Interwikimap_list().To_ary(Site_interwikimap_itm.class));} @@ -421,6 +426,6 @@ class Site_json_parser_fxt { public void Test_showhook(Site_showhook_itm... expd) {Tfds.Eq_ary_str(expd, (Site_showhook_itm[])site_meta.Showhook_list().To_ary(Site_showhook_itm.class));} public void Test_extensiontag(String... expd) {Tfds.Eq_ary_str(expd, String_.Ary((byte[][])site_meta.Extensiontag_list().To_ary(byte[].class)));} public void Test_protocol(String... expd) {Tfds.Eq_ary_str(expd, String_.Ary((byte[][])site_meta.Protocol_list().To_ary(byte[].class)));} - public void Test_defaultoption(KeyVal... expd) {Tfds.Eq_ary_str(expd, (KeyVal[])site_meta.Defaultoption_list().To_ary(KeyVal.class));} + public void Test_defaultoption(Keyval... expd) {Tfds.Eq_ary_str(expd, (Keyval[])site_meta.Defaultoption_list().To_ary(Keyval.class));} public void Test_language(Site_language_itm... expd) {Tfds.Eq_ary_str(expd, (Site_language_itm[])site_meta.Language_list().To_ary(Site_language_itm.class));} } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java index a21f1065b..a8d9038e6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java @@ -29,7 +29,7 @@ class Site_kv_tbl implements Db_tbl { this.fld_val = flds.Add_str("val", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_key)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_key)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); @@ -44,7 +44,7 @@ class Site_kv_tbl implements Db_tbl { while (rdr.Move_next()) { String key = rdr.Read_str(fld_key); String val = rdr.Read_str(fld_val); - list.Add(key, KeyVal_.new_(key, val)); + list.Add(key, Keyval_.new_(key, val)); } } finally {rdr.Rls();} @@ -55,7 +55,7 @@ class Site_kv_tbl implements Db_tbl { stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete(); int len = list.Count(); for (int i = 0; i < len; ++i) { - KeyVal itm = (KeyVal)list.Get_at(i); + Keyval itm = (Keyval)list.Get_at(i); Insert(site_abrv, itm.Key(), itm.Val_to_str_or_empty()); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java index 74abb67d7..276531890 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java @@ -29,7 +29,7 @@ class Site_language_tbl implements Db_tbl { this.fld_name = flds.Add_str("name", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java index 7d051aed0..9376b5975 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java @@ -29,7 +29,7 @@ class Site_library_tbl implements Db_tbl { this.fld_version = flds.Add_str("version", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java index e20756ab5..da47c2619 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java @@ -30,7 +30,7 @@ class Site_magicword_tbl implements Db_tbl { this.fld_aliases = flds.Add_str("aliases", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_meta_parser__general.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_meta_parser__general.java index 4c147b91f..2a1063de0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_meta_parser__general.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_meta_parser__general.java @@ -18,9 +18,9 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.core.primitives.*; import gplx.langs.jsons.*; class Site_meta_parser__general extends Json_parser__list_nde__base { - private final Site_meta_parser__general__kv parser__image = new Site_meta_parser__general__kv("imagelimits", "width", "height"); - private final Site_meta_parser__general__lone parser__fallback = new Site_meta_parser__general__lone("fallback", "code"); - private final Site_meta_parser__general__kv parser__variants = new Site_meta_parser__general__kv("variants", "code", "name"); + private final Site_meta_parser__general__kv parser__image = new Site_meta_parser__general__kv("imagelimits", "width", "height"); + private final Site_meta_parser__general__lone parser__fallback = new Site_meta_parser__general__lone("fallback", "code"); + private final Site_meta_parser__general__kv parser__variants = new Site_meta_parser__general__kv("variants", "code", "name"); private String cur_context; public void Parse(String context, Ordered_hash list, Json_nde nde) { this.cur_context = context + ".general"; @@ -38,7 +38,7 @@ class Site_meta_parser__general extends Json_parser__list_nde__base { } } private static final int Tid__fallback = 1, Tid__variants = 2, Tid__thumblimits = 3, Tid__imagelimits = 4, Tid__imagelimits__width = 5, Tid__imagelimits__height = 6; - private static final Hash_adp_bry complex_props = Hash_adp_bry.cs() + private static final Hash_adp_bry complex_props = Hash_adp_bry.cs() .Add_str_int("fallback" , Tid__fallback) .Add_str_int("variants" , Tid__variants) .Add_str_int("thumblimits" , Tid__thumblimits) @@ -120,7 +120,7 @@ class Site_meta_parser__statistic extends Json_parser__list_nde__base { class Site_meta_parser__interwikimap extends Json_parser__list_nde__base { private Ordered_hash list; public Site_meta_parser__interwikimap() { - this.Ctor("prefix", "local", "language", "localinterwiki", "url", "protorel"); + this.Ctor("prefix", "local", "extralanglink", "linktext", "sitename", "language", "localinterwiki", "url", "protorel"); } public void Parse(String context, Ordered_hash list, Json_ary nde) { this.list = list; @@ -128,7 +128,10 @@ class Site_meta_parser__interwikimap extends Json_parser__list_nde__base { } @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { byte[] key = Kv__bry(atrs, 0); - list.Add(key, new Site_interwikimap_itm(key, Kv__mw_bool(atrs, 1), Kv__bry_or_empty(atrs, 2), Kv__mw_bool(atrs, 3), Kv__bry(atrs, 4), Kv__mw_bool(atrs, 5))); + list.Add(key + , new Site_interwikimap_itm(key + , Kv__mw_bool(atrs, 1), Kv__mw_bool(atrs, 2), Kv__bry_or_empty(atrs, 3), Kv__bry_or_empty(atrs, 4) + , Kv__bry_or_empty(atrs, 5), Kv__mw_bool(atrs, 6), Kv__bry(atrs, 7), Kv__mw_bool(atrs, 8))); } } class Site_meta_parser__namespacealias extends Json_parser__list_nde__base { @@ -246,7 +249,7 @@ class Site_meta_parser__showhook extends Json_parser__list_nde__base { } list.Add(key, new Site_showhook_itm(key, scribunto, subscribers_bry_ary)); } - private final static byte[] Key__scribunto = Bry_.new_a7("scribunto"); + private final static byte[] Key__scribunto = Bry_.new_a7("scribunto"); } class Site_meta_parser__language extends Json_parser__list_nde__base { private Ordered_hash list; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java index 4d47bbf69..2fea84c4c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java @@ -34,7 +34,7 @@ public class Site_namespace_tbl implements Db_tbl { this.fld_defaultcontentmodel = flds.Add_str("defaultcontentmodel", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java index aaf68ad61..8e8f3454a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java @@ -29,7 +29,7 @@ class Site_namespacealias_tbl implements Db_tbl { this.fld_alias = flds.Add_str("alias", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id, fld_alias)));} // NOTE: kk.w has duplicate entries in json + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id, fld_alias)));} // NOTE: kk.w has duplicate entries in json public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java index 9557ac6e4..21ed1f5b6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java @@ -30,7 +30,7 @@ class Site_showhook_tbl implements Db_tbl { this.fld_subscribers = flds.Add_str("subscribers", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java index 5f453b641..73d5b6e55 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java @@ -31,7 +31,7 @@ class Site_skin_tbl implements Db_tbl { this.fld_unusable = flds.Add_bool("unusable"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java index e7fc5c978..3dff6b4ba 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java @@ -29,7 +29,7 @@ class Site_specialpagealias_tbl implements Db_tbl { this.fld_aliases = flds.Add_str("aliases", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main")), fld_site_abrv, fld_realname)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main")), fld_site_abrv, fld_realname)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java index 766072b2c..c14604667 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java @@ -36,7 +36,7 @@ class Site_statistic_tbl implements Db_tbl { this.fld_queued_massmessages = flds.Add_long("queued_massmessages"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java index a2b042594..46a28fbf1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java @@ -29,7 +29,7 @@ class Site_val_tbl implements Db_tbl { this.fld_val = flds.Add_str("val", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_val)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_val)));} public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_dumper_tst.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_dumper_tst.java index 40934a578..5344794b6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_dumper_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_dumper_tst.java @@ -82,8 +82,8 @@ class Xob_xml_dumper_fxt { private Xowe_wiki wiki; private final Xob_xml_dumper export_wtr = new Xob_xml_dumper(); public void Clear() { - Xoae_app app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_(app, "enwiki"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app, "enwiki"); } public Xowd_page_itm[] Make_ary(Xowd_page_itm... ary) {return ary;} public Xowd_page_itm Make_page(int id, int ns_id, String ttl_str, String text) { 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 7c7f9ed9f..1ce92b69b 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 @@ -21,7 +21,7 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_xml_parser_tst { @Before public void init() { Io_mgr.Instance.InitEngine_mem(); - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); bldr = new Xob_bldr(app); } private Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.A7()); @Test public void Basic_docs_1() { diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app.java b/400_xowa/src/gplx/xowa/drds/Xod_app.java index bedcc4e6e..dba1f620d 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app.java @@ -18,15 +18,19 @@ along with this program. If not, see . package gplx.xowa.drds; import gplx.*; import gplx.xowa.*; import gplx.xowa.drds.pages.*; import gplx.xowa.drds.files.*; import gplx.xowa.apps.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.wikis.nss.*; import gplx.xowa.files.gui.*; -import gplx.xowa.specials.search.*; import gplx.xowa.specials.randoms.*; +import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.files.gui.*; +import gplx.xowa.addons.searchs.searchers.rslts.*; import gplx.xowa.specials.randoms.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.hrefs.*; +import gplx.xowa.addons.searchs.*; import gplx.xowa.addons.searchs.searchers.*; +import gplx.xowa.langs.cases.*; public class Xod_app { - private final Xoav_app app; - private final Xod_page_mgr page_mgr = new Xod_page_mgr(); - private final Xod_file_mgr file_mgr = new Xod_file_mgr(); + private final Xoav_app app; + private final Xod_page_mgr page_mgr = new Xod_page_mgr(); + private final Xod_file_mgr file_mgr = new Xod_file_mgr(); + private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr(); public Xod_app(Xoav_app app) { this.app = app; + ns_mgr.Add_main_if_empty(); } public Xow_wiki Wikis__get_by_domain(String wiki_domain) { Xow_wiki rv = app.Wiki_mgri().Get_by_or_make_init_y(Bry_.new_u8(wiki_domain)); @@ -41,19 +45,10 @@ public class Xod_app { Xoa_url url = wiki.Utl__url_parser().Parse(random_ttl_bry); return Wiki__get_by_url(wiki, url); } -// public String[] Wiki__search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search) { -// Srch_db_wkr search_wkr = new Srch_db_wkr(); -// Srch_rslt_itm[] rows = search_wkr.Search_by_drd(cancelable, wiki, ui_async, Bry_.new_u8(search), 50); -// int len = rows.length; -// String[] rv = new String[len]; -// for (int i = 0; i < len; ++i) { -// rv[i] = String_.new_u8(rows[i].page_ttl.Page_txt()); -// } -// return rv; -// } - public void Wiki__search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search, Xod_search_cmd[] cmds) { - for (Xod_search_cmd cmd : cmds) - cmd.Search(cancelable, rslt_lnr, wiki, search); + public void Wiki__search(Cancelable cxl, Srch_rslt_cbk cbk, Xow_wiki wiki, String search, int bgn, int end) { + Srch_search_addon addon = Get_addon(wiki); + Srch_search_qry qry = Srch_search_qry.New__drd(wiki, ns_mgr, Bry_.new_u8(search), bgn, end); + addon.Search(qry, cbk); } public void Page__load_files(Xow_wiki wiki, Xod_page_itm pg, Xog_js_wkr js_wkr) { file_mgr.Load_files(wiki, pg, js_wkr); @@ -67,4 +62,5 @@ public class Xod_app { page_bry = Xoa_ttl.Replace_spaces(page_bry); // convert spaces to unders; canonical-url has spaces return page_bry; } + private Srch_search_addon Get_addon(Xow_wiki wiki) {return Srch_search_addon.Get(wiki);} } diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java index d99dc32e4..8b7ac24f4 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java @@ -41,7 +41,7 @@ class Xod_app_tstr { this.app = Xoa_app_fxt.Make__app__view(); this.wiki = Xoa_app_fxt.Make__wiki__view(app); data_mgr.Wiki_(wiki); - Xoa_test_.Init__db__mem(wiki); + Xoa_test_.Init__db__view(wiki); drd_provider = new Xod_app(app); } public Xowd_data_tstr Data_mgr() {return data_mgr;} private final Xowd_data_tstr data_mgr = new Xowd_data_tstr(); diff --git a/400_xowa/src/gplx/xowa/drds/Xod_search_cmd_.java b/400_xowa/src/gplx/xowa/drds/Xod_search_cmd_.java deleted file mode 100644 index 7696109fd..000000000 --- a/400_xowa/src/gplx/xowa/drds/Xod_search_cmd_.java +++ /dev/null @@ -1,74 +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.drds; import gplx.*; import gplx.xowa.*; -import gplx.xowa.specials.search.*; -import gplx.xowa.wikis.data.tbls.*; -public class Xod_search_cmd_ { - public static final Xod_search_cmd - New__page_eq = Xod_search_cmd__page_eq.Instance - , New__page_like = Xod_search_cmd__page_like.Instance - , New__word_eq = Xod_search_cmd__word_tbl.Instance_eq - , New__word_like = Xod_search_cmd__word_tbl.Instance_like - ; -} -class Xod_search_cmd__page_eq implements Xod_search_cmd { - public void Search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search) { - Xowd_page_itm page_itm = new Xowd_page_itm(); - if (wiki.Data__core_mgr().Tbl__page().Select_by_ttl(page_itm, wiki.Ns_mgr().Ns_main(), Bry_.Ucase__1st(Bry_.new_u8(search)))) { - Srch_rslt_itm search_itm = new Srch_rslt_itm(wiki.Domain_bry(), wiki.Ttl_parse(page_itm.Ttl_page_db()), page_itm.Id(), page_itm.Text_len()); - rslt_lnr.Notify_rslt_found(search_itm); - } - } - public static final Xod_search_cmd__page_eq Instance = new Xod_search_cmd__page_eq(); Xod_search_cmd__page_eq() {} -} -class Xod_search_cmd__page_like implements Xod_search_cmd {// NOTE: slow; takes at least 10+ seconds - public void Search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search) { - List_adp tmp_list = List_adp_.new_(); - wiki.Data__core_mgr().Tbl__page().Select_by_search(cancelable, tmp_list, Bry_.Ucase__1st(Bry_.new_u8(search + "*")), 50); - int len = tmp_list.Count(); - for (int i = 0; i < len; ++i) { - Xowd_page_itm page_itm = (Xowd_page_itm)tmp_list.Get_at(i); - Srch_rslt_itm search_itm = new Srch_rslt_itm(wiki.Domain_bry(), wiki.Ttl_parse(page_itm.Ttl_page_db()), page_itm.Id(), page_itm.Text_len()); - rslt_lnr.Notify_rslt_found(search_itm); - } - } - public static final Xod_search_cmd__page_like Instance = new Xod_search_cmd__page_like(); Xod_search_cmd__page_like() {} -} -class Xod_search_cmd__word_tbl implements Xod_search_cmd { - private final boolean wildcard; - private final int results_wanted; - private final Srch_db_wkr search_wkr = new Srch_db_wkr(); - Xod_search_cmd__word_tbl(boolean wildcard, int results_wanted) {this.wildcard = wildcard; this.results_wanted = results_wanted;} - public void Search(Cancelable cancelable, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, String search) { - search_wkr.Search_by_drd(cancelable, rslt_lnr, wiki, Bry_.new_u8(Standardize_search(search, wildcard)), results_wanted); - } - public static final Xod_search_cmd__word_tbl Instance_eq = new Xod_search_cmd__word_tbl(Bool_.N, 10), Instance_like = new Xod_search_cmd__word_tbl(Bool_.Y, 50); - private static String Standardize_search(String search, boolean wildcard) { - String rv = ""; - String[] words = String_.Split(search, " "); - int words_len = words.length; - for (int i = 0; i < words_len; ++i) { - String word = words[i]; - if (String_.Len(word) < 3) continue; - if (String_.Len(rv) != 0) rv += " "; - rv += word; - if (wildcard) rv += "*"; - } - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java index aa88f6eba..8a2c6e1cd 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java @@ -58,7 +58,6 @@ public class Xof_fsdb_itm implements Xof_file_itm { public boolean Fsdb_insert() {return fsdb_insert;} public void Fsdb_insert_y_() {fsdb_insert = true;} private boolean fsdb_insert; public int Xfer_idx() {return xfer_idx;} private int xfer_idx; public int Xfer_len() {return xfer_len;} private int xfer_len; - public void Init_at_lnki(int exec_tid, byte[] wiki_abrv, byte[] lnki_ttl, byte lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page, int lnki_upright_patch) { this.lnki_exec_tid = exec_tid; this.lnki_wiki_abrv = wiki_abrv; this.lnki_type = lnki_type; this.lnki_upright = lnki_upright; this.lnki_upright_patch = lnki_upright_patch; diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size.java b/400_xowa/src/gplx/xowa/files/Xof_img_size.java index 4ce825147..d7366b4ae 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size.java @@ -58,7 +58,6 @@ public class Xof_img_size { } html_w = Upright_calc(upright_patch, lnki_upright, html_w, lnki_w, lnki_h, lnki_type); if (orig_w == Null) return; // no orig_w; just use html_w and html_h (html_h will likely be -1 and wrong) - boolean ext_is_svg = orig_ext == Xof_ext_.Id_svg; if (html_w == Xof_img_size.Null) { if ( ext_is_svg // following strange MW logic; REF.MW:Linker.php|makeImageLink|If its a vector image, and user only specifies height, we don't want it to be limited by its "normal" width; DATE: 2013-11-26 @@ -159,16 +158,13 @@ MW calls the falling procs . File.php|scaleHeight Note that this proc is a selective culling of the w,h setting code in the above (the procs do a lot of other checks/building) also, MW's if branching can be combined. for now, emulating MW and not enforcing matching if/else - NOTE_2: lnki_ratio > orig_ratio REF.MW:media/MediaHandler.php|fitBoxWidth COMMENT:"Height is the relative smaller dimension, so scale width accordingly" - consider file of 200,100 (2:1) EX_1: view is 120,40 (3:1) - dimensions are either (a) 120,80 or (b) 80,40 - use (b) 80,40 - EX_2: view is 120,80 (1.5:1) - dimensions are either (a) 120,60 or (b) 160,80 - use (a) 120,60 diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java index f9ed4f0ab..e354d700c 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java @@ -47,10 +47,8 @@ public class Xof_img_size_tst { @Test public void Upright() {fxt.Lnki_upright_(1).Lnki_(-1, -1).Orig_(440, 400).Test_html(220, 200);} @Test public void Upright_w_thumb() {fxt.Lnki_type_(Xop_lnki_type.Id_thumb).Lnki_upright_(2).Lnki_(-1, -1).Orig_(1500, 1125).Test_html(440, 330);} @Test public void Upright_ignored_by_w() {fxt.Lnki_type_(Xop_lnki_type.Id_thumb).Lnki_upright_(3.2).Lnki_(900, -1).Orig_(4653, 854).Test_html(900, 165);}// PAGE: fr.w:Bogota; DATE:2014-05-22 - @Test public void Explicit_ratio_large() {fxt.Lnki_(120, 40).Test_html( 80, 40);} // see NOTE_2: lnki_ratio > orig_ratio @Test public void Explicit_ratio_small() {fxt.Lnki_(120, 80).Test_html(120, 60);} // see NOTE_2: lnki_ratio > orig_ratio - @Test public void Lnki_gt_orig_null_svg_example() { // EX:[[File:Crystal Clear app kedit.svg|50x40px]] fxt.Lnki_ext_(Xof_ext_.Id_svg).Lnki_type_(Xop_lnki_type.Id_null).Lnki_( 50, 40).Orig_( 40, 40).Test_html( 40, 40); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java index 3c8ceeb4b..4174886cd 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java @@ -47,8 +47,8 @@ class Xof_bin_wkr__http_wmf__fxt { private Io_stream_rdr get_as_rdr__rdr; public Xof_fsdb_itm_fxt Fsdb_itm_mkr() {return fsdb_itm_mkr;} private final Xof_fsdb_itm_fxt fsdb_itm_mkr = new Xof_fsdb_itm_fxt(); public Xof_bin_wkr__http_wmf__fxt() { - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); Xoa_app_fxt.repo2_(app, wiki); this.download_mgr = Io_download_mgr_.new_memory(); this.wkr = Xof_bin_wkr__http_wmf.new_(wiki, download_mgr); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java index 01d12db62..4b21f8441 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java @@ -34,7 +34,7 @@ class Xofc_dir_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_name) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } stmt_bldr.Conn_(conn, tbl_name, flds, fld_id); conn.Rls_reg(this); @@ -80,7 +80,7 @@ class Xofc_dir_tbl implements Rls_able { } finally {rdr.Rls();} } - public int Select_max_uid() {return Db_conn_.Select_fld0_as_int_or(conn, "SELECT Max(uid) AS MaxId FROM cache_dir;", -1);} + public int Select_max_uid() {return conn.Exec_select_as_int("SELECT Max(uid) AS MaxId FROM cache_dir;", -1);} private Xofc_dir_itm new_itm(Db_rdr rdr) { return new Xofc_dir_itm(rdr.Read_int(fld_id), rdr.Read_bry_by_str(fld_name), Db_cmd_mode.Tid_ignore); } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java index 2fd8d1fa8..845e23606 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java @@ -49,7 +49,7 @@ class Xofc_fil_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "fil", fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_cache_time, fld_uid) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } select_itm_stmt = select_itm_v2_stmt = null; stmt_bldr.Conn_(conn, tbl_name, flds, fld_uid); @@ -135,7 +135,7 @@ class Xofc_fil_tbl implements Rls_able { } finally {rdr.Rls();} } - public int Select_max_uid() {return Db_conn_.Select_fld0_as_int_or(conn, "SELECT Max(uid) AS MaxId FROM cache_fil;", -1);} + public int Select_max_uid() {return conn.Exec_select_as_int("SELECT Max(uid) AS MaxId FROM cache_fil;", -1);} private Xofc_fil_itm new_itm(Db_rdr rdr) { return new Xofc_fil_itm ( rdr.Read_int(fld_uid) diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java index 9e555b54b..f87316476 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java @@ -32,7 +32,7 @@ public class Xou_cache_mgr { public long Fsys_size_cur() {return fsys_size_cur;} private long fsys_size_cur = 0; public long Fsys_size_min() {return fsys_size_min;} public void Fsys_size_min_(long v) {fsys_size_min = v;} private long fsys_size_min = Io_mgr.Len_mb * 75; public long Fsys_size_max() {return fsys_size_max;} public void Fsys_size_max_(long v) {fsys_size_max = v;} private long fsys_size_max = Io_mgr.Len_mb * 100; - public KeyVal[] Info() { + public Keyval[] Info() { long view_date = Long_.Max_value; long fsys_size = 0; int len = hash.Count(); @@ -41,11 +41,11 @@ public class Xou_cache_mgr { fsys_size += itm.File_size(); if (itm.View_date() < view_date) view_date = itm.View_date(); } - return KeyVal_.Ary - ( KeyVal_.new_("cache folder", cache_dir.Xto_api()) - , KeyVal_.new_("space used", gplx.core.ios.Io_size_.To_str(fsys_size)) - , KeyVal_.new_("file count", len) - , KeyVal_.new_("oldest file", view_date == Long_.Max_value ? "" : DateAdp_.unixtime_utc_seconds_(view_date).XtoStr_fmt_iso_8561()) + return Keyval_.Ary + ( Keyval_.new_("cache folder", cache_dir.Xto_api()) + , Keyval_.new_("space used", gplx.core.ios.Io_size_.To_str(fsys_size)) + , Keyval_.new_("file count", len) + , Keyval_.new_("oldest file", view_date == Long_.Max_value ? "" : DateAdp_.unixtime_utc_seconds_(view_date).XtoStr_fmt_iso_8561()) ); } public Xou_cache_itm Get_or_null(Xof_fsdb_itm fsdb) {return Get_or_null(fsdb.Lnki_wiki_abrv(), fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page(), fsdb.User_thumb_w());} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java index da17f6ef6..bd26684f8 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java @@ -63,10 +63,10 @@ class Xou_cache_mgr_fxt { Tfds.Now_set(DateAdp_.new_(1970, 1, 1, 0, 0, 0, 0)); Io_mgr.Instance.InitEngine_mem(); Db_conn_bldr.Instance.Reg_default_mem(); - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); app.User().User_db_mgr().Init_by_app(Bool_.N, app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "xowa.user.anonymous.sqlite3")); - Xoa_app_fxt.repo_(app, Xoa_app_fxt.wiki_(app, "en.wikipedia.org")); - Xoa_app_fxt.repo_(app, Xoa_app_fxt.wiki_(app, "fr.wikipedia.org")); + Xoa_app_fxt.repo_(app, Xoa_app_fxt.Make__wiki__edit(app, "en.wikipedia.org")); + Xoa_app_fxt.repo_(app, Xoa_app_fxt.Make__wiki__edit(app, "fr.wikipedia.org")); this.mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), app.User().User_db_mgr().Db_file()); } public void Init_delete(long min, long max) { diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java index b6a6de47c..58f937546 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java @@ -70,7 +70,7 @@ public class Xou_cache_tbl implements Rls_able { , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "size", fld_file_size) , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "date", fld_view_date) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } public Xou_cache_itm Select_one(byte[] lnki_wiki_abrv, byte[] lnki_ttl, int lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page, int user_thumb_w) { if (select_stmt == null) select_stmt = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_lnki_wiki_abrv, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page, fld_user_thumb_w)); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java index 71ab22e0b..344d90b1c 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java @@ -37,7 +37,7 @@ public class Orig_fil_tbl implements Rls_able { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_name) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } stmt_insert = stmt_select = null; conn.Rls_reg(this); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java index 9369f28a1..ad9aaa7f7 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java @@ -30,8 +30,8 @@ class Xof_file_fxt { Io_mgr.Instance.InitEngine_mem(); // NOTE: files are downloaded to mem_engine, regardless of Db being mem or sqlite; always reset Io_url root_url = Xoa_test_.Url_root(); Xoa_test_.Db_init(root_url); - app = Xoa_app_fxt.app_(Op_sys.Cur().Os_name(), root_url); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(Op_sys.Cur().Os_name(), root_url); + wiki = Xoa_app_fxt.Make__wiki__edit(app); wiki.File__fsdb_mode().Tid_v2_bld_y_(); this.fsdb_mgr = (Xof_fsdb_mgr__sql)wiki.File_mgr().Fsdb_mgr(); this.orig_mgr = wiki.File__orig_mgr(); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java index 8723b4bfd..dd7ba7600 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java @@ -30,7 +30,7 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); this.schema_1 = db_core_mgr.File__schema_is_1(); conn = db_core_mgr.File__orig_tbl_ary()[gplx.fsdb.meta.Fsm_mnt_mgr.Mnt_idx_main].Conn(); - Io_url make_db_url = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Url(); + Io_url make_db_url = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Url(); Sqlite_engine_.Db_attach(conn, "make_db", make_db_url.Raw()); } public void Cmd_run() {Exec();} diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index 042bbe6f5..1f83e1473 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -40,7 +40,7 @@ public class Xof_orig_tbl implements Rls_able { conn.Rls_reg(this); } public void Rls() {} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} public void Select_by_list(Ordered_hash rv, List_adp itms) {select_in_wkr.Init(rv, itms).Select_in(Cancelable_.Never, conn, 0, itms.Count());} public Xof_orig_itm Select_itm(byte[] ttl) { Xof_orig_itm rv = Xof_orig_itm.Null; diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java index ef9abfb9d..92024f4b2 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java @@ -30,7 +30,6 @@ public class Xof_orig_wkr_ { rv.Add(fsdb_ttl, orig); } } - public static final byte Tid_xowa_db = 1 , Tid_wmf_api = 2 diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java index 7729d6939..2fda1e738 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_base_fxt.java @@ -26,9 +26,9 @@ public class Xof_xfer_queue_base_fxt { @gplx.Virtual public void Clear(boolean src_repo_is_wmf) { Io_mgr.Instance.InitEngine_mem(); if (app == null) { - app = Xoa_app_fxt.app_(); - en_wiki = Xoa_app_fxt.wiki_(app, Xow_domain_itm_.Str__enwiki); - commons = Xoa_app_fxt.wiki_(app, Xow_domain_itm_.Str__commons); + app = Xoa_app_fxt.Make__app__edit(); + en_wiki = Xoa_app_fxt.Make__wiki__edit(app, Xow_domain_itm_.Str__enwiki); + commons = Xoa_app_fxt.Make__wiki__edit(app, Xow_domain_itm_.Str__commons); app.Wiki_mgr().Add(commons); app.Wiki_mgr().Add(en_wiki); diff --git a/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java b/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java index 3f3d5ac71..82b42e991 100644 --- a/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.xowa.guis; import gplx.*; import gplx.xowa.*; import gplx.core.brys.fmtrs.*; import gplx.core.envs.*; -import gplx.gfui.*; import gplx.xowa.specials.search.*; import gplx.xowa.guis.menus.*; import gplx.xowa.guis.cmds.*; import gplx.xowa.apps.cfgs.gui.*; import gplx.xowa.users.*; +import gplx.gfui.*; import gplx.xowa.addons.searchs.*; import gplx.xowa.guis.menus.*; import gplx.xowa.guis.cmds.*; import gplx.xowa.apps.cfgs.gui.*; import gplx.xowa.users.*; import gplx.xowa.langs.*; import gplx.xowa.guis.bnds.*; import gplx.xowa.guis.views.*; import gplx.xowa.guis.urls.url_macros.*; -import gplx.xowa.guis.views.boots.*; +import gplx.xowa.guis.views.boots.*; public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { public Xoa_gui_mgr(Xoae_app app) { this.ev_mgr = GfoEvMgr.new_(this); @@ -30,7 +30,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { win_cfg = new Xocfg_win(app); html_mgr = new Xog_html_mgr(app); menu_mgr = new Xog_menu_mgr(this); - search_suggest_mgr = new Xog_search_suggest_mgr(this); + search_cfg = new Srch_search_cfg(app); } public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr; public Xoae_app App() {return app;} private Xoae_app app; @@ -42,12 +42,12 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { public Xocfg_win Win_cfg() {return win_cfg;} private Xocfg_win win_cfg; public Xog_layout Layout() {return layout;} private Xog_layout layout = new Xog_layout(); public Xog_html_mgr Html_mgr() {return html_mgr;} private Xog_html_mgr html_mgr; - public Xog_search_suggest_mgr Search_suggest_mgr() {return search_suggest_mgr;} private Xog_search_suggest_mgr search_suggest_mgr; + public Srch_search_cfg Search_cfg() {return search_cfg;} private Srch_search_cfg search_cfg; public Xog_menu_mgr Menu_mgr() {return menu_mgr;} private Xog_menu_mgr menu_mgr; public Xog_url_macro_mgr Url_macro_mgr() {return url_macro_mgr;} private Xog_url_macro_mgr url_macro_mgr = new Xog_url_macro_mgr(); public void Show_prog() { GfuiWin memo_win = kit.New_win_utl("memo_win", browser_win.Win_box()); - GfuiTextBox memo_txt = kit.New_text_box("memo_txt", memo_win, KeyVal_.new_(GfuiTextBox_.Ctor_Memo, true)); + GfuiTextBox memo_txt = kit.New_text_box("memo_txt", memo_win, Keyval_.new_(GfuiTextBox_.Ctor_Memo, true)); RectAdp prog_box_rect = browser_win.Prog_box().Rect(); memo_win.Rect_set(RectAdp_.new_(prog_box_rect.X(), prog_box_rect.Y() - 75, prog_box_rect.Width(), 100)); memo_txt.Size_(memo_win.Size().Op_add(-8, -30)); @@ -90,7 +90,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { else if (ctx.Match(k, Invk_win_opts)) return win_cfg; else if (ctx.Match(k, Invk_layout)) return layout; else if (ctx.Match(k, Invk_html)) return html_mgr; - else if (ctx.Match(k, Invk_search_suggest)) return search_suggest_mgr; + else if (ctx.Match(k, Invk_search_suggest)) return search_cfg; else if (ctx.Match(k, Invk_menus)) return menu_mgr; else if (ctx.Match(k, Invk_cmds)) return cmd_mgr; else if (ctx.Match(k, Invk_url_macros)) return url_macro_mgr; diff --git a/400_xowa/src/gplx/xowa/guis/Xog_resizer.java b/400_xowa/src/gplx/xowa/guis/Xog_resizer.java index f149d6ec1..f45536447 100644 --- a/400_xowa/src/gplx/xowa/guis/Xog_resizer.java +++ b/400_xowa/src/gplx/xowa/guis/Xog_resizer.java @@ -23,7 +23,8 @@ public class Xog_resizer { Xog_layout layout = app.Gui_mgr().Layout(); Xog_win_itm main_win = app.Gui_mgr().Browser_win(); GfuiBtn go_bwd_btn = main_win.Go_bwd_btn(), go_fwd_btn = main_win.Go_fwd_btn(), url_exec_btn = main_win.Url_exec_btn(), search_exec_btn = main_win.Search_exec_btn(), find_fwd_btn = main_win.Find_fwd_btn(), find_bwd_btn = main_win.Find_bwd_btn(), find_close_btn = main_win.Find_close_btn(); - GfuiTextBox url_box = main_win.Url_box(), search_box = main_win.Search_box(), find_box = main_win.Find_box(), prog_box = main_win.Prog_box(), note_box = main_win.Info_box(); + GfuiComboBox url_box = main_win.Url_box(); + GfuiTextBox search_box = main_win.Search_box(), find_box = main_win.Find_box(), prog_box = main_win.Prog_box(), note_box = main_win.Info_box(); Gfui_tab_mgr tab_mgr = main_win.Tab_mgr().Tab_mgr(); int txt_dim = layout.Box_height_calc(app.Gui_mgr().Kit(), url_box); int btn_dim = 25; // txt_dim + 1; @@ -81,6 +82,12 @@ public class Xog_resizer { cur_box.Margins_set(0, txt_margin_v, 0, txt_margin_v); } catch (Exception e) {Err_.Noop(e);} } + else if (Type_adp_.Eq_typeSafe(cur_elem, GfuiComboBox.class)) { + try { + GfuiComboBox cur_box = (GfuiComboBox)cur_elem; + cur_box.Margins_set(0, txt_margin_v, 0, txt_margin_v); + } catch (Exception e) {Err_.Noop(e);} + } if (box.Mode() == Xog_layout_box.Mode_abs) // absolute mode; set dimensions manually cur_elem_rect.X_(box.X_abs()).Y_(box.Y_abs()).W_(box.W_abs()).H_(box.H_abs()); else { diff --git a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_itm_srl_tst.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_itm_srl_tst.java index 16a9f9746..88c2b72ed 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_itm_srl_tst.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_itm_srl_tst.java @@ -30,7 +30,7 @@ public class Xog_bnd_itm_srl_tst { class Xog_bnd_itm_srl_fxt { private Xoae_app app; public void Reset() { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); } public Xog_bnd_itm bnd_(int box, IptArg ipt) {return new Xog_bnd_itm("test.key", true, "test.cmd", box, ipt);} public void Test_src_get(Xog_bnd_itm bnd, String expd) { diff --git a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java index 0feef9866..dda7a1a37 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr.java @@ -88,39 +88,32 @@ public class Xog_bnd_mgr { public void Init() { regy.Clear(); // clear regy, else 1 test will fail Init_itm(Xog_cmd_itm_.Key_app_exit , Xog_bnd_box_.Tid_browser , "mod.c+key.q"); - Init_itm(Xog_cmd_itm_.Key_nav_go_bwd , Xog_bnd_box_.Tid_browser , "mod.a+key.left"); Init_itm(Xog_cmd_itm_.Key_nav_go_fwd , Xog_bnd_box_.Tid_browser , "mod.a+key.right"); - Init_itm(Xog_cmd_itm_.Key_nav_cfg_main , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_cfg_menu , Xog_bnd_box_.Tid_browser , ""); - Init_itm(Xog_cmd_itm_.Key_nav_wiki_main_page , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_wiki_random , Xog_bnd_box_.Tid_browser , "mod.cs+key.r"); Init_itm(Xog_cmd_itm_.Key_nav_wiki_sandbox , Xog_bnd_box_.Tid_browser , "mod.cs+key.g,mod.cs+key.s", "mod.c+key.f1"); - Init_itm(Xog_cmd_itm_.Key_nav_help_help , Xog_bnd_box_.Tid_browser , "key.f1"); Init_itm(Xog_cmd_itm_.Key_nav_help_change_log , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_help_diagnostics , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_help_about , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_help_xowa_main , Xog_bnd_box_.Tid_browser , ""); - + Init_itm(Xog_cmd_itm_.Key_nav_help_xowa_blog , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_setup_import_from_list , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_setup_import_from_script , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_setup_maintenance , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_setup_download , Xog_bnd_box_.Tid_browser , ""); - Init_itm(Xog_cmd_itm_.Key_nav_system_data_log_session , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_app , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_lang , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_user , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_system_data_cfg_custom , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_nav_system_data_usr_history , Xog_bnd_box_.Tid_browser , ""); - Init_itm(Xog_cmd_itm_.Key_gui_font_increase , Xog_bnd_box_.Tid_browser , "mod.c+key.equal"); Init_itm(Xog_cmd_itm_.Key_gui_font_decrease , Xog_bnd_box_.Tid_browser , "mod.c+key.minus"); Init_itm(Xog_cmd_itm_.Key_gui_font_reset , Xog_bnd_box_.Tid_browser , "mod.c+key.d0"); - Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_read , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.r"); Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_edit , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.e"); Init_itm(Xog_cmd_itm_.Key_gui_page_view_mode_html , Xog_bnd_box_.Tid_browser , "mod.c+key.m,mod.c+key.h", "mod.c+key.u"); @@ -128,11 +121,9 @@ public class Xog_bnd_mgr { Init_itm(Xog_cmd_itm_.Key_gui_page_view_refresh , Xog_bnd_box_.Tid_browser , "mod.s+key.f5"); Init_itm(Xog_cmd_itm_.Key_gui_page_view_save_as , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_gui_page_view_print , Xog_bnd_box_.Tid_browser , ""); - Init_itm(Xog_cmd_itm_.Key_gui_page_selection_select_all , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_gui_page_selection_copy , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_gui_page_selection_save_file_as , Xog_bnd_box_.Tid_browser , ""); - Init_itm(Xog_cmd_itm_.Key_gui_edit_save , Xog_bnd_box_.Tid_browser , "mod.as+key.s"); Init_itm(Xog_cmd_itm_.Key_gui_edit_save_draft , Xog_bnd_box_.Tid_browser , "mod.c+key.s"); Init_itm(Xog_cmd_itm_.Key_gui_edit_focus_edit_box , Xog_bnd_box_.Tid_browser , "mod.as+key.comma"); @@ -140,7 +131,6 @@ public class Xog_bnd_mgr { Init_itm(Xog_cmd_itm_.Key_gui_edit_dbg_tmpl , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.e", "mod.as+key.d,mod.as+key.d"); Init_itm(Xog_cmd_itm_.Key_gui_edit_dbg_html , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.h"); Init_itm(Xog_cmd_itm_.Key_gui_edit_exec , Xog_bnd_box_.Tid_browser , "mod.c+key.e,mod.c+key.g"); - Init_itm(Xog_cmd_itm_.Key_gui_browser_url_focus , Xog_bnd_box_.Tid_browser , "mod.a+key.d", "mod.c+key.l"); Init_itm(Xog_cmd_itm_.Key_gui_browser_url_exec , Xog_bnd_box_.Tid_browser_url , "key.enter", "key.keypad_enter"); Init_itm(Xog_cmd_itm_.Key_gui_browser_url_exec_new_tab_by_paste , Xog_bnd_box_.Tid_browser_url , "mod.c+key.enter", "mod.c+key.keypad_enter"); @@ -187,15 +177,11 @@ public class Xog_bnd_mgr { Init_itm(Xog_cmd_itm_.Key_gui_browser_info_focus , Xog_bnd_box_.Tid_browser , "mod.ca+key.i"); Init_itm(Xog_cmd_itm_.Key_gui_browser_info_clear , Xog_bnd_box_.Tid_browser , "mod.ca+key.c"); Init_itm(Xog_cmd_itm_.Key_gui_browser_prog_log_show , Xog_bnd_box_.Tid_browser_prog , "mouse.middle", "mod.cs+key.p"); - Init_itm(Xog_cmd_itm_.Key_html_tidy_toggle , Xog_bnd_box_.Tid_browser , "key.f7"); - Init_itm(Xog_cmd_itm_.Key_usr_bookmarks_add , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_usr_bookmarks_show , Xog_bnd_box_.Tid_browser , "key.f3"); - Init_itm(Xog_cmd_itm_.Key_usr_history_goto_recent , Xog_bnd_box_.Tid_browser , "mod.cs+key.l"); Init_itm(Xog_cmd_itm_.Key_usr_history_show , Xog_bnd_box_.Tid_browser , "mod.cs+key.h"); - Init_itm(Xog_cmd_itm_.Key_net_enabled_n_ , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_net_enabled_y_ , Xog_bnd_box_.Tid_browser , ""); Init_itm(Xog_cmd_itm_.Key_net_enabled_x_ , Xog_bnd_box_.Tid_browser , ""); @@ -216,14 +202,15 @@ public class Xog_bnd_mgr { } private void Add_system_bnds() { IptCfg null_cfg = IptCfg_.Null; IptEventType btn_event_type = IptEventType_.add_(IptEventType_.MouseUp, IptEventType_.KeyDown); IptArg[] btn_args = IptArg_.Ary(IptMouseBtn_.Left, IptKey_.Enter, IptKey_.Space); - IptBnd_.ipt_to_(null_cfg , win.Go_bwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_bwd , btn_event_type, btn_args); - IptBnd_.ipt_to_(null_cfg , win.Go_fwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_fwd , btn_event_type, btn_args); + IptBnd_.ipt_to_(null_cfg , win.Go_bwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_bwd , btn_event_type, btn_args); + IptBnd_.ipt_to_(null_cfg , win.Go_fwd_btn() , invk_mgr, Xog_cmd_itm_.Key_nav_go_fwd , btn_event_type, btn_args); IptBnd_.ipt_to_(null_cfg , win.Url_exec_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_url_exec , btn_event_type, btn_args); IptBnd_.ipt_to_(null_cfg , win.Search_exec_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_search_exec , btn_event_type, btn_args); IptBnd_.ipt_to_(null_cfg , win.Find_close_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_hide , btn_event_type, btn_args); IptBnd_.ipt_to_(null_cfg , win.Find_fwd_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_find_fwd , btn_event_type, btn_args); IptBnd_.ipt_to_(null_cfg , win.Find_bwd_btn() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_find_bwd , btn_event_type, btn_args); - IptBnd_.ipt_to_(null_cfg , win.Find_box() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_type , IptEventType_.KeyUp, IptKey_.printableKeys_(IptKey_.Ary(IptKey_.Back, IptKey_.Escape), IptKey_.Ary())); + IptBnd_.ipt_to_(null_cfg , win.Find_box() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_find_type , IptEventType_.KeyUp, IptKey_.printableKeys_(IptKey_.Ary(IptKey_.Back, IptKey_.Escape, IptKey_.Ctrl.Add(IptKey_.V)), IptKey_.Ary())); + IptBnd_.ipt_to_(null_cfg , win.Url_box() , invk_mgr, Xog_cmd_itm_.Key_gui_browser_url_type , IptEventType_.KeyUp, IptKey_.printableKeys_(IptKey_.Ary(IptKey_.Back, IptKey_.Escape, IptKey_.Ctrl.Add(IptKey_.X), IptKey_.Ctrl.Add(IptKey_.V)), IptKey_.Ary())); } private void Add_custom_bnds() { // NOTE: custom bnds are stored in cfg; cfg executes before Init_by_kit when all windows elements are null; run cfg now, while Init_by_kit is called and elems are now created int len = startup_itms.Count(); diff --git a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr_srl.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr_srl.java index b7de8834e..4f9f11fb8 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr_srl.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_mgr_srl.java @@ -52,7 +52,6 @@ public class Xog_bnd_mgr_srl extends Dsv_wkr_base { if (uid == -1) throw parser.Err_row_bgn("bnd missing uid", pos); if (box_bry == null) throw parser.Err_row_bgn("bnd missing box", pos); if (ipt_bry == null) throw parser.Err_row_bgn("bnd missing ipt", pos); - if (uids == null) Init(); Xog_bnd_itm bnd = (Xog_bnd_itm)uids.Get_by(Int_obj_val.new_(uid)); int box = Xog_bnd_box_.Xby_gui_str(String_.new_u8(box_bry)); @@ -66,4 +65,4 @@ public class Xog_bnd_mgr_srl extends Dsv_wkr_base { String cfg_key = String_.Concat("app.cfg.get.gui.bnds.init('", bnd.Key(), "').src"); app.Cfg_mgr().Set_by_app(cfg_key, src); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/guis/cmds/Xog_cmd_itm_.java b/400_xowa/src/gplx/xowa/guis/cmds/Xog_cmd_itm_.java index 45d95d92d..a4e0d93a9 100644 --- a/400_xowa/src/gplx/xowa/guis/cmds/Xog_cmd_itm_.java +++ b/400_xowa/src/gplx/xowa/guis/cmds/Xog_cmd_itm_.java @@ -17,30 +17,31 @@ along with this program. If not, see . */ package gplx.xowa.guis.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; public class Xog_cmd_itm_ { - private static final Ordered_hash regy = Ordered_hash_.New(); // NOTE: must be defined at top - public static final String + private static final Ordered_hash regy = Ordered_hash_.New(); // NOTE: must be defined at top + public static final String Key_app_exit = new_dflt_(Xog_ctg_itm_.Tid_app , "xowa.app.exit") , Key_nav_go_bwd = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.go_bwd") , Key_nav_go_fwd = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.go_fwd") - , Key_nav_cfg_main = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.main" , "home/wiki/Help:Options") - , Key_nav_cfg_menu = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.menus" , "home/wiki/Help:Options/Menus") + , Key_nav_cfg_main = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.main" , "home/wiki/Options") // HOME + , Key_nav_cfg_menu = new_page_(Xog_ctg_itm_.Tid_nav , "xowa.nav.cfg.menus" , "home/wiki/Options/Menus") // HOME , Key_nav_wiki_main_page = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.main_page") , Key_nav_wiki_sandbox = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.sandbox") , Key_nav_wiki_random = new_dflt_(Xog_ctg_itm_.Tid_nav , "xowa.nav.wiki.random") - , Key_nav_help_help = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.help" , "home/wiki/Help:Contents") - , Key_nav_help_about = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.about" , "home/wiki/Help:About") - , Key_nav_help_change_log = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.change_log" , "home/wiki/Help:Change_log") - , Key_nav_help_diagnostics = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.diagnostics" , "home/wiki/Help:Diagnostics") - , Key_nav_help_xowa_main = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_main" , "home/wiki/Main_Page") + , Key_nav_help_help = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.help" , "home/wiki/Help/Contents") // HOME + , Key_nav_help_about = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.about" , "home/wiki/Help/About") // HOME + , Key_nav_help_change_log = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.change_log" , "home/wiki/Change_log") // HOME + , Key_nav_help_diagnostics = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.diagnostics" , "home/wiki/Diagnostics") // HOME + , Key_nav_help_xowa_main = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_main" , "home/wiki/Main_Page") // HOME + , Key_nav_help_xowa_blog = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.help.xowa_blog" , "home/wiki/Blog") // HOME - , Key_nav_setup_import_from_list = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_list" , "home/wiki/Help:Import/List") - , Key_nav_setup_import_from_script = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_script" , "home/wiki/Help:Import/Script") - , Key_nav_setup_maintenance = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.maintenance" , "home/wiki/Help:Wiki_maintenance") - , Key_nav_setup_download = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.download" , "home/wiki/Help:Download") + , Key_nav_setup_import_from_list = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_list" , "home/wiki/Dashboard/Import/Online") // HOME + , Key_nav_setup_import_from_script = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.import_from_script" , "home/wiki/Dashboard/Import/Offline") // HOME + , Key_nav_setup_maintenance = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.maintenance" , "home/wiki/Dashboard/Wiki_maintenance") // HOME + , Key_nav_setup_download = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.setup.download" , "home/wiki/Dashboard/Image_databases") // HOME , Key_nav_system_data_log_session = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.log_session" , "Special:XowaSystemData?type=log_session") , Key_nav_system_data_cfg_app = new_page_(Xog_ctg_itm_.Tid_nav_pages , "xowa.nav.system_data.cfg_app" , "Special:XowaSystemData?type=cfg_app") @@ -78,6 +79,8 @@ public class Xog_cmd_itm_ { , Key_gui_browser_url_exec_by_paste = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.exec_by_paste") , Key_gui_browser_url_exec_new_tab_by_paste = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.exec_new_tab_by_paste") , Key_gui_browser_url_restore = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.restore") + , Key_gui_browser_url_type = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.url.type") + , Key_gui_browser_search_focus = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.search.focus") , Key_gui_browser_search_exec = new_dflt_(Xog_ctg_itm_.Tid_browser , "xowa.gui.browser.search.exec") , Key_gui_browser_tabs_new_dflt__at_dflt__focus_y = new_dflt_(Xog_ctg_itm_.Tid_tabs , "xowa.gui.browser.tabs.new_dflt__at_dflt__focus_y") @@ -160,7 +163,7 @@ public class Xog_cmd_itm_ { public static Xog_cmd_itm Regy_get_at(int i) {return (Xog_cmd_itm)regy.Get_at(i);} public static Xog_cmd_itm Regy_get_or_null(String key) {return (Xog_cmd_itm)regy.Get_by(key);} public static void Regy_add(Xog_cmd_itm itm) {regy.Add(itm.Key(), itm);} - public static final byte[] + public static final byte[] Msg_pre_api = Bry_.new_a7("api-") , Msg_pre_ctg = Bry_.new_a7("api.ctg-") , Msg_suf_name = Bry_.new_a7("-name") diff --git a/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java b/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java index 4ac035435..aa0643cce 100644 --- a/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java +++ b/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java @@ -42,8 +42,8 @@ class Xog_history_stack_fxt { public Xog_history_stack_fxt Clear() { stack.Clear(); if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); } return this; } private Xoae_app app; private Xowe_wiki wiki; private Xog_history_stack stack = new Xog_history_stack(); diff --git a/400_xowa/src/gplx/xowa/guis/menus/Xog_menu_mnu_src.java b/400_xowa/src/gplx/xowa/guis/menus/Xog_menu_mnu_src.java index 490f34f43..45622d8a1 100644 --- a/400_xowa/src/gplx/xowa/guis/menus/Xog_menu_mnu_src.java +++ b/400_xowa/src/gplx/xowa/guis/menus/Xog_menu_mnu_src.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.guis.menus; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cmds.*; class Xog_menu_mgr_src { - public static final String Browser_win + public static final String Browser_win = Xog_menu_bldr.Instance . Add_grp_bgn(Xog_cmd_itm_.Key_gui_menus_group_file) . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_dflt__at_dflt__focus_y) @@ -71,6 +71,7 @@ class Xog_menu_mgr_src { . Add_grp_bgn(Xog_cmd_itm_.Key_gui_menus_group_help) . Add_btn(Xog_cmd_itm_.Key_nav_help_help) . Add_btn(Xog_cmd_itm_.Key_nav_help_xowa_main) + . Add_btn(Xog_cmd_itm_.Key_nav_help_xowa_blog) . Add_btn(Xog_cmd_itm_.Key_nav_help_change_log) . Add_btn(Xog_cmd_itm_.Key_nav_help_diagnostics) . Add_btn(Xog_cmd_itm_.Key_nav_cfg_menu) @@ -87,7 +88,7 @@ class Xog_menu_mgr_src { . Add_btn(Xog_cmd_itm_.Key_nav_help_about) . Add_grp_end() . Gen_str(); - public static final String Html_page + public static final String Html_page = Xog_menu_bldr.Instance . Add_btn(Xog_cmd_itm_.Key_nav_go_bwd) . Add_btn(Xog_cmd_itm_.Key_nav_go_fwd) @@ -150,6 +151,7 @@ class Xog_menu_mgr_src { . Add_grp_bgn(Xog_cmd_itm_.Key_gui_menus_group_help) . Add_btn(Xog_cmd_itm_.Key_nav_help_help) . Add_btn(Xog_cmd_itm_.Key_nav_help_xowa_main) + . Add_btn(Xog_cmd_itm_.Key_nav_help_xowa_blog) . Add_btn(Xog_cmd_itm_.Key_nav_help_change_log) . Add_btn(Xog_cmd_itm_.Key_nav_help_diagnostics) . Add_btn(Xog_cmd_itm_.Key_nav_cfg_menu) @@ -158,7 +160,7 @@ class Xog_menu_mgr_src { . Add_grp_end() . Gen_str(); - public static final String Html_link + public static final String Html_link = Xog_menu_bldr.Instance . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_n) . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_y) @@ -166,14 +168,14 @@ class Xog_menu_mgr_src { . Add_btn(Xog_cmd_itm_.Key_gui_page_selection_copy) . Add_btn(Xog_cmd_itm_.Key_gui_browser_find_show_by_paste) . Gen_str(); - public static final String Html_file + public static final String Html_file = Xog_menu_bldr.Instance . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_n) . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_link__at_dflt__focus_y) . Add_spr() . Add_btn(Xog_cmd_itm_.Key_gui_page_selection_save_file_as) . Gen_str(); - public static final String Tabs_btns + public static final String Tabs_btns = Xog_menu_bldr.Instance . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_dflt__at_dflt__focus_y) . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_new_dupe__at_dflt__focus_y) @@ -191,11 +193,11 @@ class Xog_menu_mgr_src { . Add_spr() . Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_close_undo) . Gen_str(); - public static final String Prog + public static final String Prog = Xog_menu_bldr.Instance . Add_btn(Xog_cmd_itm_.Key_gui_browser_prog_log_show) . Gen_str(); - public static final String Info = String_.Concat_lines_nl + public static final String Info = String_.Concat_lines_nl ( "" ); } @@ -235,7 +237,7 @@ class Xog_menu_bldr { bfr.Add(Const_itm_btn_bgn_rhs); return this; } - private static final byte[] + private static final byte[] Const_spr = Bry_.new_a7("add_spr;\n") , Const_itm_btn_bgn_lhs = Bry_.new_a7("add_btn_default('") , Const_itm_btn_bgn_rhs = Bry_.new_a7("');\n") @@ -243,5 +245,5 @@ class Xog_menu_bldr { , Const_itm_grp_bgn_rhs = Bry_.new_a7("') {\n") , Const_itm_grp_end = Bry_.new_a7("}\n") ; - public static final Xog_menu_bldr Instance = new Xog_menu_bldr(); Xog_menu_bldr() {} + public static final Xog_menu_bldr Instance = new Xog_menu_bldr(); Xog_menu_bldr() {} } diff --git a/400_xowa/src/gplx/xowa/guis/menus/dom/Xog_mnu_grp.java b/400_xowa/src/gplx/xowa/guis/menus/dom/Xog_mnu_grp.java index e343c7384..90842b5c6 100644 --- a/400_xowa/src/gplx/xowa/guis/menus/dom/Xog_mnu_grp.java +++ b/400_xowa/src/gplx/xowa/guis/menus/dom/Xog_mnu_grp.java @@ -71,7 +71,7 @@ public class Xog_mnu_grp extends Xog_mnu_base { } Xog_mnu_bldr bldr = gui_mgr.Menu_mgr().Menu_bldr(); bldr.Build(under_mnu, this); - Xog_mnu_base.Update_grp_by_lang(bldr, app.Usere().Lang(), this); // NOTE: always set lang after rebuild; else changes in Help:Options/Menus will show blank captions; DATE:2014-06-05 + Xog_mnu_base.Update_grp_by_lang(bldr, app.Usere().Lang(), this); // NOTE: always set lang after rebuild; else changes in home/wiki/Options/Menus will show blank captions; DATE:2014-06-05 if (mnu_is_popup) { boolean rebind_to_win = false; if (String_.Eq(key, Xog_popup_mnu_mgr.Root_key_tabs_btns)) { diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java index b3dd52ef1..386ff8aab 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java @@ -86,8 +86,8 @@ public class Xog_tab_itm implements GfoInvkAble { tab_box.Tab_tip_text_(page.Url().To_str()); } public void Tab_name_() { - byte[] tab_name = page.Html_data().Custom_tab_name(); // Custom_tab_name set by Special:Default_tab or variants; DATE:2015-10-05 - if (tab_name == null) tab_name = page.Ttl().Full_txt(); // no custom_tab_name; use ttl's text + byte[] tab_name = page.Html_data().Custom_tab_name(); // Custom_tab_name set by Special:Default_tab or variants; DATE:2015-10-05 + if (tab_name == null) tab_name = page.Ttl().Full_txt_w_ttl_case(); // no custom_tab_name; use ttl's text Tab_name_(String_.new_u8(tab_name)); } public void Tab_name_(String tab_name) { @@ -104,12 +104,12 @@ public class Xog_tab_itm implements GfoInvkAble { Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg(); if ( url.Anch_str() != null // url has anchor && url.Eq_page(page.Url()) // url has same page_name as existing page - && url.Qargs_ary().length == 0) { // url has no args; needed for Category:A?from=b#mw-pages + && 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 (win.Page__async__working(url)) return; - app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls + app.Gui_mgr().Search_cfg().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(); @@ -118,7 +118,7 @@ public class Xog_tab_itm implements GfoInvkAble { 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())); + Tab_name_(String_.new_u8(ttl.Full_txt_w_ttl_case())); usr_dlg.Prog_one("", "", "loading: ~{0}", String_.new_u8(ttl.Raw())); if (app.Api_root().Html().Modules().Popups().Enabled()) 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 @@ -152,7 +152,7 @@ public class Xog_tab_itm implements GfoInvkAble { usr_dlg.Prog_many("", "", "could not find: ~{0} (redirected from ~{1})", String_.new_u8(page.Url().Page_bry()), String_.new_u8((byte[])page.Redirected_ttls().Get_at(0))); else { if (ttl.Ns().Id_is_file()) - usr_dlg.Prog_one("", "", "commons.wikimedia.org must be installed in order to view the file. See [[Help:Wikis/Commons]]: ~{0}", String_.new_u8(url.Raw())); + usr_dlg.Prog_one("", "", "commons.wikimedia.org must be installed in order to view the file. See [[App/Wiki_types/Commons]]: ~{0}", String_.new_u8(url.Raw()));// HOME else usr_dlg.Prog_one("", "", "could not find: ~{0}", String_.new_u8(url.Raw())); } diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java index 3ab49d539..1b4e9b809 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java @@ -25,7 +25,8 @@ public class Xog_tab_itm_edit_mgr { Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki(); Xog_win_itm win_itm = tab.Tab_mgr().Win(); byte[] new_text = Get_new_text(tab); if (page.Edit_mode() == Xoa_page_.Edit_mode_create) { - wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text); + int page_id = wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text); + page.Revision_data().Id_(page_id); page.Edit_mode_update_(); // set to update so that next save does not try to create } else { diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_read_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_read_mgr.java index 31fd124f7..469954a95 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_read_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_read_mgr.java @@ -63,12 +63,12 @@ public class Xog_tab_itm_read_mgr { String url_str = "", win_str = Win_text_blank; if (url != null && ttl != null) { url_str = url.To_str(); - win_str = String_.new_u8(Bry_.Add(ttl.Full_txt(), Win_text_suffix_page)); + win_str = String_.new_u8(Bry_.Add(ttl.Full_txt_w_ttl_case(), Win_text_suffix_page)); } win.Url_box().Text_(url_str); win.Win_box().Text_(win_str); } - private static final byte[] Win_text_suffix_page = Bry_.new_a7(" - XOWA"); private static final String Win_text_blank = "XOWA"; + private static final byte[] Win_text_suffix_page = Bry_.new_a7(" - XOWA"); private static final String Win_text_blank = "XOWA"; public static void Show_page_err(Xog_win_itm win, Xog_tab_itm tab, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl, Exception e) { String err_msg = String_.Format("page_load fail: page={0} err={1}", String_.new_u8(url.Raw()), Err_.Message_gplx_full(e)); win.Usr_dlg().Warn_many("", "", err_msg); diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java index aaf54db20..f603463ad 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java @@ -24,6 +24,7 @@ import gplx.xowa.htmls.hrefs.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.math.*; public class Xog_win_itm implements GfoInvkAble, GfoEvObj { private GfoInvkAble sync_cmd; + private Xog_url_box__selection_changed url_box__selection_changed; 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); @@ -33,7 +34,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public GfuiWin Win_box() {return win_box;} private GfuiWin win_box; public GfuiBtn Go_bwd_btn() {return go_bwd_btn;} private GfuiBtn go_bwd_btn; public GfuiBtn Go_fwd_btn() {return go_fwd_btn;} private GfuiBtn go_fwd_btn; - public GfuiTextBox Url_box() {return url_box;} private GfuiTextBox url_box; + public GfuiComboBox Url_box() {return url_box;} private GfuiComboBox url_box; public GfuiBtn Url_exec_btn() {return url_exec_btn;} private GfuiBtn url_exec_btn; public GfuiTextBox Search_box() {return search_box;} private GfuiTextBox search_box; public GfuiBtn Search_exec_btn() {return search_exec_btn;} private GfuiBtn search_exec_btn; @@ -188,7 +189,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { if (new_page.Ttl().Ns().Id_is_special()) // if Special, reload page; needed for Special:Search (DATE:2015-04-19; async loading) and Special:XowaBookmarks DATE:2015-10-05 new_page = new_page.Wikie().Data_mgr().Load_page_by_ttl(new_page.Url(), new_page.Ttl()); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save byte history_nav_type = fwd ? Xog_history_stack.Nav_fwd : Xog_history_stack.Nav_bwd; - boolean new_page_is_same = Bry_.Eq(cur_page.Ttl().Full_txt(), new_page.Ttl().Full_txt()); + boolean new_page_is_same = Bry_.Eq(cur_page.Ttl().Full_txt_by_orig(), new_page.Ttl().Full_txt_by_orig()); Xog_tab_itm_read_mgr.Show_page(tab, new_page, true, new_page_is_same, false, history_nav_type); Page__async__bgn(tab); } @@ -277,7 +278,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { FontAdp ui_font = app.Gui_mgr().Win_cfg().Font().XtoFontAdp(); go_bwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "go_bwd_btn", "go_bwd.png" ); go_fwd_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "go_fwd_btn", "go_fwd.png" ); - url_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "url_box" , true); + url_box = Xog_win_itm_.new_cbo(app, kit, win_box, ui_font, "url_box" , true); url_exec_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "url_exec_btn", "url_exec.png" ); search_box = Xog_win_itm_.new_txt(app, kit, win_box, ui_font, "search_box" , true); search_exec_btn = Xog_win_itm_.new_btn(app, kit, win_box, img_dir, "search_exec_btn", "search_exec.png" ); @@ -292,10 +293,43 @@ 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); + url_box__selection_changed = new Xog_url_box__selection_changed(app, url_box); + GfoEvMgr_.SubSame(url_box, GfuiComboBox.Evt__selected_changed, url_box__selection_changed); + GfoEvMgr_.SubSame(url_box, GfuiComboBox.Evt__selected_accepted, url_box__selection_changed); if ( !Env_.Mode_testing() && app.Mode().Tid_is_gui()) // only run for gui; do not run for tcp/http server; DATE:2014-05-03 app.Usr_dlg().Gui_wkr_(new Gfo_usr_dlg__gui__swt(kit, prog_box, info_box, info_box, app.Api_root().Gui().Browser().Info())); } + public static String Remove_redirect_if_exists(String text) { + // remove redirect target; EX: "A -> B" -> "A" + int redirect_pos = String_.FindFwd(text, gplx.xowa.addons.searchs.searchers.rslts.Srch_rslt_row.Str__redirect__text); + if (redirect_pos != Bry_find_.Not_found) { + text = String_.Mid(text, 0, redirect_pos); + } + return text; + } +} +class Xog_url_box__selection_changed implements GfoEvObj { + private final GfuiComboBox url_box; + private final Xoae_app app; + public Xog_url_box__selection_changed(Xoae_app app, GfuiComboBox url_box) {this.app = app; this.url_box = url_box; this.ev_mgr = GfoEvMgr.new_(this);} + public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; + private void On_selection_changed() { + String text = url_box.Text(); + text = Xog_win_itm.Remove_redirect_if_exists(text); + // always move cursor to end; emulates firefox url_bar behavior + url_box.Text_(text); + url_box.Sel_(String_.Len(text), String_.Len(text)); + } + private void On_selection_accepted() { + app.Api_root().Nav().Goto(url_box.Text()); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, GfuiComboBox.Evt__selected_changed)) On_selection_changed(); + else if (ctx.Match(k, GfuiComboBox.Evt__selected_accepted)) On_selection_accepted(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } } diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm_.java b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm_.java index f8beef786..72fef97f6 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm_.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm_.java @@ -36,8 +36,13 @@ public class Xog_win_itm_ { rv.Btn_img_(kit.New_img_load(img_dir.GenSubFil(file))); return rv; } + public static GfuiComboBox new_cbo(Xoae_app app, Gfui_kit kit, GfuiWin win, FontAdp ui_font, String id, boolean border_on) { + GfuiComboBox rv = kit.New_combo(id, win, Keyval_.new_(GfuiTextBox.CFG_border_on_, border_on)); + rv.TextMgr().Font_(ui_font); + return rv; + } public static GfuiTextBox new_txt(Xoae_app app, Gfui_kit kit, GfuiWin win, FontAdp ui_font, String id, boolean border_on) { - GfuiTextBox rv = kit.New_text_box(id, win, KeyVal_.new_(GfuiTextBox.CFG_border_on_, border_on)); + GfuiTextBox rv = kit.New_text_box(id, win, Keyval_.new_(GfuiTextBox.CFG_border_on_, border_on)); rv.TextMgr().Font_(ui_font); return rv; } diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page.java index b15c1a3ba..cf288bae8 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page.java @@ -34,7 +34,6 @@ public class Xoh_page implements Xoa_page { public byte[] Sidebar_div() {return sidebar_div;} private byte[] sidebar_div; public Xoh_section_mgr Section_mgr() {return section_mgr;} private final Xoh_section_mgr section_mgr = new Xoh_section_mgr(); public Xoh_img_mgr Img_mgr() {return img_mgr;} private Xoh_img_mgr img_mgr = new Xoh_img_mgr(); - public Ordered_hash Redlink_uids() {return redlink_uids;} private final Ordered_hash redlink_uids = Ordered_hash_.New(); public Xohd_img_itm__base[] Img_itms() {return img_itms;} public void Img_itms_(Xohd_img_itm__base[] v) {this.img_itms = v;} private Xohd_img_itm__base[] img_itms = Xohd_img_itm__base.Ary_empty; public Ordered_hash Gallery_itms() {return gallery_itms;} private Ordered_hash gallery_itms = Ordered_hash_.New(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr_tst.java index f9006d58a..a374fa6af 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr_tst.java @@ -21,8 +21,8 @@ import gplx.xowa.guis.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.portal public class Xoh_page_wtr_mgr_tst { @Before public void init() {} @Test public void Logo_has_correct_main_page() { // PURPOSE: Logo href should be "/site/en.wikipedia.org/wiki/", not "/wiki/Main_Page" - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); Xow_portal_mgr portal_mgr = wiki.Html_mgr().Portal_mgr(); GfoInvkAble_.InvkCmd_val(portal_mgr, Xow_portal_mgr.Invk_div_logo_, Bry_.new_a7("~{portal_nav_main_href}")); portal_mgr.Init_assert(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java index b1f0a3834..4ab15d686 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java @@ -22,9 +22,9 @@ import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.skins.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.parsers.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.apps.gfs.*; import gplx.xowa.htmls.portal.*; public class Xoh_page_wtr_wkr { - private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private final Object thread_lock_1 = new Object(), thread_lock_2 = new Object(); - private final Xoh_page_wtr_mgr mgr; private final byte page_mode; - private final Wdata_xwiki_link_wtr wdata_lang_wtr = new Wdata_xwiki_link_wtr(); // In other languages + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private final Object thread_lock_1 = new Object(), thread_lock_2 = new Object(); + private final Xoh_page_wtr_mgr mgr; private final byte page_mode; + private final Wdata_xwiki_link_wtr wdata_lang_wtr = new Wdata_xwiki_link_wtr(); // In other languages private Xoae_app app; private Xowe_wiki wiki; private Xop_ctx ctx; private Xoae_page page; private byte[] root_dir_bry; public Xoh_page_wtr_wkr(Xoh_page_wtr_mgr mgr, byte page_mode) {this.mgr = mgr; this.page_mode = page_mode;} public Xoh_page_wtr_wkr Ctgs_enabled_(boolean v) {ctgs_enabled = v; return this;} private boolean ctgs_enabled = true; @@ -69,7 +69,6 @@ public class Xoh_page_wtr_wkr { // if custom_html, use it and exit; needed for Default_tab byte[] custom_html = page.Html_data().Custom_html(); if (custom_html != null) {bfr.Add(custom_html); return;} - // temp variables if (root_dir_bry == null) this.root_dir_bry = app.Fsys_mgr().Root_dir().To_http_file_bry(); Xoa_ttl page_ttl = page.Ttl(); int page_ns_id = page_ttl.Ns().Id(); @@ -121,7 +120,7 @@ public class Xoh_page_wtr_wkr { case Xow_page_tid.Tid_js: case Xow_page_tid.Tid_css: case Xow_page_tid.Tid_lua: Write_body_pre (bfr, app, wiki, data_raw, tmp_bfr); page_tid_uses_pre = true; break; - case Xow_page_tid.Tid_json: app.Wiki_mgr().Wdata_mgr().Write_json_as_html(bfr, page_ttl.Page_db(), data_raw); break; + case Xow_page_tid.Tid_json: app.Wiki_mgr().Wdata_mgr().Write_json_as_html(bfr, page_ttl.Full_db(), data_raw); break; case Xow_page_tid.Tid_wikitext: Write_body_wikitext (bfr, app, wiki, data_raw, hctx, page, page_tid, page_ns_id); break; } } @@ -138,26 +137,21 @@ public class Xoh_page_wtr_wkr { bfr.Add(hdump_data); return; } - // dump and exit if MediaWiki message; if (ns_id == Xow_ns_.Tid__mediawiki) { // if MediaWiki and wikitext, must be a message; convert args back to php; DATE:2014-06-13 bfr.Add(Xoa_gfs_php_mgr.Xto_php(tmp_bfr, Bool_.N, data_raw)); return; } - // if [[File]], add boilerplate header; note that html is XOWA-generated so does not need to be tidied if (ns_id == Xow_ns_.Tid__file) app.Ns_file_page_mgr().Bld_html(wiki, ctx, page, bfr, page.Ttl(), wiki.Cfg_file_page(), page.File_queue()); - // get separate bfr; note that bfr already has and written to it, so this can't be passed to tidy; DATE:2014-06-11 Bry_bfr tidy_bfr = app.Utl__bfr_mkr().Get_m001(); - // write wikitext if (page.Root() != null) // NOTE: will be null if blank; occurs for one test: Logo_has_correct_main_page; DATE:2015-09-29 wiki.Html_mgr().Html_wtr().Write_all(tidy_bfr, page.Wikie().Parser_mgr().Ctx(), hctx, page.Root().Data_mid(), page.Root()); // if [[Category]], render rest of html (Subcategories; Pages; Files); note that a category may have other html which requires wikitext processing if (ns_id == Xow_ns_.Tid__category) wiki.Html_mgr().Ns_ctg().Bld_html(wiki, page, hctx, tidy_bfr); - // tidy html gplx.xowa.htmls.core.htmls.tidy.Xoh_tidy_mgr tidy_mgr = app.Html_mgr().Tidy_mgr(); if (tidy_mgr.Enabled()) tidy_mgr.Run_tidy_html(page, tidy_bfr, !hctx.Mode_is_hdump()); @@ -165,7 +159,6 @@ public class Xoh_page_wtr_wkr { // add back to main bfr bfr.Add_bfr_and_clear(tidy_bfr); tidy_bfr.Mkr_rls(); - // handle Categories at bottom of page; note that html is XOWA-generated so does not need to be tidied int ctgs_len = page.Category_list().length; if ( ctgs_enabled @@ -178,7 +171,6 @@ public class Xoh_page_wtr_wkr { else wiki.Html_mgr().Ctg_mgr().Bld(bfr, page, ctgs_len); } - // translate if variants are enabled Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); if (vnt_mgr.Enabled()) bfr.Add(vnt_mgr.Convert_lang().Parse_page(vnt_mgr.Cur_itm(), page.Revision_data().Id(), bfr.To_bry_and_clear())); @@ -201,5 +193,5 @@ public class Xoh_page_wtr_wkr { if (data_raw_len > 0) // do not add nl if empty String bfr.Add_byte_nl(); // per MW:EditPage.php: "Ensure there's a newline at the end, otherwise adding lines is awkward." } - private static final byte[] Content_editable_bry = Bry_.new_a7(" contenteditable=\"true\""); + private static final byte[] Content_editable_bry = Bry_.new_a7(" contenteditable=\"true\""); } diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_.java index efa46fbb7..1e698ddbc 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_.java @@ -33,7 +33,7 @@ public class Xoh_page_wtr_wkr_ { return tmp_bfr.To_bry_and_clear(); } else - return ttl.Full_txt(); // NOTE: include ns with ttl as per defect d88a87b3 + return ttl.Full_txt_w_ttl_case(); // NOTE: include ns with ttl as per defect d88a87b3 } public static void Bld_head_end(Bry_bfr html_bfr, Xoae_page page) { byte[] head_end = page.Html_data().Custom_head_end(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_tst.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_tst.java index c6b44c748..dc6f35f65 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr_tst.java @@ -43,8 +43,8 @@ public class Xoh_page_wtr_wkr_tst { class Xoh_page_wtr_fxt { public void Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); } } private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private Xowe_wiki wiki; public Xoae_app App() {return app;} private Xoae_app app; diff --git a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java index efe2d8440..9a7b77509 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java @@ -40,8 +40,8 @@ public class Xohp_ctg_grp_mgr_tst { } class Xoh_ctg_mgr_fxt { public Xoh_ctg_mgr_fxt Clear() { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); ctg_grp_mgr = new Xohp_ctg_grp_mgr(); return this; } private Xohp_ctg_grp_mgr ctg_grp_mgr; Xoae_app app; Xowe_wiki wiki; Bry_bfr tmp_bfr = Bry_bfr.new_(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java index 4616b177b..5eec90c1f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java @@ -50,7 +50,7 @@ public class Xow_hdump_mgr__load { hpg.Body_(page_override); return true; } - Xowd_db_file html_db = wiki.Data__core_mgr().Dbs__get_at(tmp_dbpg.Html_db_id()); + Xowd_db_file html_db = wiki.Data__core_mgr().Dbs__get_by_id(tmp_dbpg.Html_db_id()); if (!html_db.Tbl__html().Select_by_page(hpg)) return Load__fail(hpg); // nothing in "html" table byte[] src = Parse(hpg, hpg.Body_zip_tid(), hpg.Body_hzip_tid(), hpg.Body()); hpg.Body_(src); diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java index 555329166..dd3577c9c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java @@ -68,7 +68,7 @@ public class Xow_hdump_mgr__save { core_data_mgr.Tbl__page().Update__html_db_id(page.Revision_data().Id(), html_db_id); } else { - rv = core_data_mgr.Dbs__get_at(html_db_id); + rv = core_data_mgr.Dbs__get_by_id(html_db_id); } return rv; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_img_cmd.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_img_cmd.java index 39ef1f777..1609b47f4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_img_cmd.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_img_cmd.java @@ -30,8 +30,8 @@ class Xob_hdump_img_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_term() {} private void Exec_main() { Bry_bfr bfr = Bry_bfr.reset_(Io_mgr.Len_mb); - Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); - Db_rdr rdr = conn.Stmt_new(gplx.dbs.qrys.Db_qry_sql.rdr_(Sql_select_itm)).Exec_select__rls_auto(); + Db_conn conn = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_rdr rdr = conn.Stmt_sql(Sql_select_clause).Exec_select__rls_auto(); // html_tbl = new Xowd_html_tbl(conn, wiki.Db_mgr_as_sql().Core_data_mgr().Props().Zip_tid_text()); int cur_page_id = -1; while (rdr.Move_next()) { @@ -57,7 +57,7 @@ class Xob_hdump_img_cmd extends Xob_itm_basic_base implements Xob_cmd { if (page_id == -1 || data.length == 0) return; // html_tbl.Insert(page_id, Xohd_img_tid.Tid_img, data); } - private static final String Sql_select_itm = String_.Concat_lines_nl_skip_last + private static final String Sql_select_clause = String_.Concat_lines_nl_skip_last ( "SELECT lt.lnki_page_id" , ", lt.html_uid" , ", lt.lnki_ttl" diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_cmd.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_cmd.java index 134061e76..138b485d4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_cmd.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_cmd.java @@ -32,8 +32,8 @@ public class Xob_link_dump_cmd { tbl.Insert_end(); tbl.Create_idx_1(); Db_conn conn = tbl.Conn(); - Db_attach_cmd.new_(conn, "page_db", page_db_url) - .Add_fmt("update trg_page_id", String_.Concat_lines_nl_skip_last + new Db_attach_mgr(conn, new Db_attach_itm("page_db", page_db_url)) + .Exec_sql_w_msg("update trg_page_id", String_.Concat_lines_nl_skip_last ( "REPLACE INTO link_dump" , "SELECT r.uid" , ", r.src_page_id" @@ -42,10 +42,9 @@ public class Xob_link_dump_cmd { , ", r.trg_ns" , ", r.trg_ttl" , "FROM link_dump r" - , " LEFT JOIN page_db.page p ON r.trg_ns = p.page_namespace AND r.trg_ttl = p.page_title" + , " LEFT JOIN page p ON r.trg_ns = p.page_namespace AND r.trg_ttl = p.page_title" , ";" - )) - .Exec(); + ));; conn.Exec_sql("UPDATE link_dump SET trg_ns = -1 AND trg_ttl = '' WHERE trg_page_id != -1;"); tbl.Create_idx_2(); conn.Env_vacuum(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java index 50d7a3157..2bea9ad27 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java @@ -33,15 +33,15 @@ class Xob_link_dump_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} private final Db_conn conn; - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(Tbl_name, flds));} public void Create_idx_1() { - conn.Ddl_create_idx + conn.Meta_idx_create ( Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "src", Fld_src_page_id, Fld_src_html_uid) , Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "trg_temp", Fld_trg_ns, Fld_trg_ttl) ); } public void Create_idx_2() { - conn.Ddl_create_idx + conn.Meta_idx_create ( Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "trg", Fld_trg_page_id, Fld_src_page_id, Fld_src_html_uid) ); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_ns_to_db_wkr__html.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_ns_to_db_wkr__html.java index 035980f31..23b7cd3a7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_ns_to_db_wkr__html.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_ns_to_db_wkr__html.java @@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.bldrs; import gplx.*; import gplx.xowa.*; import gp import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.htmls.core.dbs.*; class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { - private final Xowd_db_file page_db; + private final Xowd_db_file page_db; public Xob_ns_to_db_wkr__html(Xowd_db_file page_db) {this.page_db = page_db;} public byte Db_tid() {return Xowd_db_file_.Tid_html_data;} public void Tbl_init(Xowd_db_file db) { @@ -30,13 +30,12 @@ class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { public void Tbl_term(Xowd_db_file db) { db.Tbl__text().Insert_end(); Db_conn db_conn = db.Conn(); - Db_attach_cmd.new_(page_db.Conn(), "html_db", db.Url()) - .Add_fmt("hdump.update page.html_db_id", Sql_update_page_html_db_id, db.Id()) - .Exec(); + new Db_attach_mgr(page_db.Conn(), new Db_attach_itm("html_db", db.Url())) + .Exec_sql_w_msg("hdump.update page.html_db_id", Sql_update_page_html_db_id, db.Id()); db_conn.Rls_conn(); } - private static final String Sql_update_page_html_db_id = String_.Concat_lines_nl_skip_last - ( "REPLACE INTO page (page_id, page_namespace, page_title, page_is_redirect, page_touched, page_len, page_random_int, page_text_db_id, page_html_db_id, page_redirect_id)" + private static final String Sql_update_page_html_db_id = String_.Concat_lines_nl_skip_last + ( "REPLACE INTO page (page_id, page_namespace, page_title, page_is_redirect, page_touched, page_len, page_random_int, page_text_db_id, page_html_db_id, page_redirect_id, page_score)" , "SELECT p.page_id" , ", p.page_namespace" , ", p.page_title" @@ -47,7 +46,8 @@ class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { , ", p.page_text_db_id" , ", {0}" , ", p.page_redirect_id" + , ", p.page_score" , "FROM page p" - , " JOIN html h ON p.page_id = h.page_id" + , " JOIN html h ON p.page_id = h.page_id" ); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_redlink_mkr_cmd.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_redlink_mkr_cmd.java index 5f83b6644..61de7bd06 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_redlink_mkr_cmd.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_redlink_mkr_cmd.java @@ -29,20 +29,21 @@ public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd { Bry_bfr bfr = Bry_bfr.reset_(255); wiki.Init_assert(); Xowd_db_file core_db = wiki.Data__core_mgr().Db__core(); - Xob_db_file link_dump_db = Xob_db_file.new__redlink(wiki.Fsys_mgr().Root_dir()); - Db_attach_rdr attach_rdr = new Db_attach_rdr(link_dump_db.Conn(), "page_db", core_db.Url()); - attach_rdr.Attach(); + Xob_db_file link_dump_db = Xob_db_file.New__redlink(wiki.Fsys_mgr().Root_dir()); + Db_attach_mgr attach_mgr = new Db_attach_mgr(link_dump_db.Conn(), new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Conn())); + String attach_sql = attach_mgr.Resolve_sql(Sql_select_clause); + attach_mgr.Attach(); Xowd_page_tbl page_tbl = core_db.Tbl__page(); int cur_html_db_id = -1, cur_page_id = -1; - Xoh_redlink_tbl redlink_tbl = new Xoh_redlink_tbl(page_tbl.Conn()); - Db_rdr rdr = attach_rdr.Exec_as_rdr(Sql_select_itm); + Xoh_redlink_tbl redlink_tbl = new Xoh_redlink_tbl(page_tbl.conn); + Db_rdr rdr = link_dump_db.Conn().Exec_rdr(attach_sql); try { while (rdr.Move_next()) { // switch html_db if needed int html_db_id = rdr.Read_int(page_tbl.Fld_html_db_id()); if (html_db_id != cur_html_db_id) { if (redlink_tbl != null) redlink_tbl.Conn().Txn_end(); - // redlink_tbl = wiki.Data__core_mgr().Dbs__get_at(html_db_id).Tbl__html_redlink(); + // redlink_tbl = wiki.Data__core_mgr().Dbs__get_by_id(html_db_id).Tbl__html_redlink(); redlink_tbl.Conn().Txn_bgn("bldr__redlink"); cur_html_db_id = html_db_id; } @@ -61,7 +62,7 @@ public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd { finally {rdr.Rls();} Commit(redlink_tbl, cur_page_id, bfr); // commit cur page redlink_tbl.Conn().Txn_end(); // close cur tbl - attach_rdr.Detach(); + attach_mgr.Detach(); } private void Commit(Xoh_redlink_tbl redlink_tbl, int cur_page_id, Bry_bfr bfr) { redlink_tbl.Insert(cur_page_id, bfr.To_bry_and_clear()); @@ -69,12 +70,12 @@ public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd { if ((commit_count % commit_interval ) == 0) redlink_tbl.Conn().Txn_sav(); } - private static final String Sql_select_itm = String_.Concat_lines_nl_skip_last + private static final String Sql_select_clause = String_.Concat_lines_nl_skip_last ( "SELECT p.page_html_db_id" , ", p.page_id" , ", ld.src_html_uid" , "FROM link_dump ld" - , " JOIN page p ON p.page_id = ld.src_page_id " + , " JOIN page p ON p.page_id = ld.src_page_id " , "WHERE ld.trg_page_id = -1" , "ORDER BY p.page_html_db_id, p.page_id" , ";" diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java index fe0ca285f..d82b4c632 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java @@ -34,7 +34,7 @@ public class Xoh_page_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("html__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert(Xoh_page hpg, int zip_tid, int hzip_tid, byte[] body) {Insert(hpg.Page_id(), hpg.Head_mgr().Flag(), zip_tid, hzip_tid, hpg.Display_ttl(), hpg.Content_sub(), hpg.Sidebar_div(), body);} diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java index 83fd703d5..9a7759c5f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java @@ -28,7 +28,7 @@ public class Xoh_redlink_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("html_redlink__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert(int page_id, byte[] redlink_uids) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java index 8c30f247e..1a2313a24 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java @@ -240,37 +240,37 @@ public class Xoh_html_wtr { Xop_xnde_tag tag = xnde.Tag(); int tag_id = tag.Id(); switch (tag_id) { - case Xop_xnde_tag_.Tid_br: + case Xop_xnde_tag_.Tid__br: if (xnde.Src_end() - xnde.Src_bgn() < 4 || xnde.Src_bgn() == -1) bfr.Add(Tag_br); else bfr.Add_mid(src, xnde.Src_bgn(), xnde.Src_end()); break; - case Xop_xnde_tag_.Tid_hr: bfr.Add(Tag_hr); break; - case Xop_xnde_tag_.Tid_includeonly: // NOTE: do not write tags or content + case Xop_xnde_tag_.Tid__hr: bfr.Add(Tag_hr); break; + case Xop_xnde_tag_.Tid__includeonly: // NOTE: do not write tags or content break; - case Xop_xnde_tag_.Tid_noinclude: // NOTE: do not write tags - case Xop_xnde_tag_.Tid_onlyinclude: + case Xop_xnde_tag_.Tid__noinclude: // NOTE: do not write tags + case Xop_xnde_tag_.Tid__onlyinclude: Xnde_subs_escape(ctx, hctx, bfr, src, xnde, false, false); break; - case Xop_xnde_tag_.Tid_nowiki: + case Xop_xnde_tag_.Tid__nowiki: Xnde_subs_escape(ctx, hctx, bfr, src, xnde, false, false); break; - case Xop_xnde_tag_.Tid_b: case Xop_xnde_tag_.Tid_strong: - case Xop_xnde_tag_.Tid_i: case Xop_xnde_tag_.Tid_em: case Xop_xnde_tag_.Tid_cite: case Xop_xnde_tag_.Tid_dfn: case Xop_xnde_tag_.Tid_var: - case Xop_xnde_tag_.Tid_u: case Xop_xnde_tag_.Tid_ins: case Xop_xnde_tag_.Tid_abbr: - case Xop_xnde_tag_.Tid_strike: case Xop_xnde_tag_.Tid_s: case Xop_xnde_tag_.Tid_del: - case Xop_xnde_tag_.Tid_sub: case Xop_xnde_tag_.Tid_sup: case Xop_xnde_tag_.Tid_big: case Xop_xnde_tag_.Tid_small: - case Xop_xnde_tag_.Tid_code: case Xop_xnde_tag_.Tid_tt: case Xop_xnde_tag_.Tid_kbd: case Xop_xnde_tag_.Tid_samp: case Xop_xnde_tag_.Tid_blockquote: - case Xop_xnde_tag_.Tid_font: case Xop_xnde_tag_.Tid_center: - case Xop_xnde_tag_.Tid_p: case Xop_xnde_tag_.Tid_span: case Xop_xnde_tag_.Tid_div: - case Xop_xnde_tag_.Tid_h1: case Xop_xnde_tag_.Tid_h2: case Xop_xnde_tag_.Tid_h3: case Xop_xnde_tag_.Tid_h4: case Xop_xnde_tag_.Tid_h5: case Xop_xnde_tag_.Tid_h6: - case Xop_xnde_tag_.Tid_dt: case Xop_xnde_tag_.Tid_dd: case Xop_xnde_tag_.Tid_ol: case Xop_xnde_tag_.Tid_ul: case Xop_xnde_tag_.Tid_dl: - case Xop_xnde_tag_.Tid_table: case Xop_xnde_tag_.Tid_tr: case Xop_xnde_tag_.Tid_td: case Xop_xnde_tag_.Tid_th: case Xop_xnde_tag_.Tid_caption: case Xop_xnde_tag_.Tid_tbody: - case Xop_xnde_tag_.Tid_ruby: case Xop_xnde_tag_.Tid_rt: case Xop_xnde_tag_.Tid_rb: case Xop_xnde_tag_.Tid_rp: - case Xop_xnde_tag_.Tid_time: case Xop_xnde_tag_.Tid_bdi: case Xop_xnde_tag_.Tid_data: case Xop_xnde_tag_.Tid_mark: case Xop_xnde_tag_.Tid_wbr: case Xop_xnde_tag_.Tid_bdo: // HTML 5: write literally and let browser handle them - case Xop_xnde_tag_.Tid_q: + case Xop_xnde_tag_.Tid__b: case Xop_xnde_tag_.Tid__strong: + case Xop_xnde_tag_.Tid__i: case Xop_xnde_tag_.Tid__em: case Xop_xnde_tag_.Tid__cite: case Xop_xnde_tag_.Tid__dfn: case Xop_xnde_tag_.Tid__var: + case Xop_xnde_tag_.Tid__u: case Xop_xnde_tag_.Tid__ins: case Xop_xnde_tag_.Tid__abbr: + case Xop_xnde_tag_.Tid__strike: case Xop_xnde_tag_.Tid__s: case Xop_xnde_tag_.Tid__del: + case Xop_xnde_tag_.Tid__sub: case Xop_xnde_tag_.Tid__sup: case Xop_xnde_tag_.Tid__big: case Xop_xnde_tag_.Tid__small: + case Xop_xnde_tag_.Tid__code: case Xop_xnde_tag_.Tid__tt: case Xop_xnde_tag_.Tid__kbd: case Xop_xnde_tag_.Tid__samp: case Xop_xnde_tag_.Tid__blockquote: + case Xop_xnde_tag_.Tid__font: case Xop_xnde_tag_.Tid__center: + case Xop_xnde_tag_.Tid__p: case Xop_xnde_tag_.Tid__span: case Xop_xnde_tag_.Tid__div: + case Xop_xnde_tag_.Tid__h1: case Xop_xnde_tag_.Tid__h2: case Xop_xnde_tag_.Tid__h3: case Xop_xnde_tag_.Tid__h4: case Xop_xnde_tag_.Tid__h5: case Xop_xnde_tag_.Tid__h6: + case Xop_xnde_tag_.Tid__dt: case Xop_xnde_tag_.Tid__dd: case Xop_xnde_tag_.Tid__ol: case Xop_xnde_tag_.Tid__ul: case Xop_xnde_tag_.Tid__dl: + case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th: case Xop_xnde_tag_.Tid__caption: case Xop_xnde_tag_.Tid__tbody: + case Xop_xnde_tag_.Tid__ruby: case Xop_xnde_tag_.Tid__rt: case Xop_xnde_tag_.Tid__rb: case Xop_xnde_tag_.Tid__rp: + case Xop_xnde_tag_.Tid__time: case Xop_xnde_tag_.Tid__bdi: case Xop_xnde_tag_.Tid__data: case Xop_xnde_tag_.Tid__mark: case Xop_xnde_tag_.Tid__wbr: case Xop_xnde_tag_.Tid__bdo: // HTML 5: write literally and let browser handle them + case Xop_xnde_tag_.Tid__q: Write_xnde(bfr, ctx, hctx, xnde, tag, tag_id, src); break; - case Xop_xnde_tag_.Tid_pre: { + case Xop_xnde_tag_.Tid__pre: { if (xnde.Tag_open_end() == xnde.Tag_close_bgn()) return; // ignore empty tags, else blank pre line will be printed; DATE:2014-03-12 byte[] name = tag.Name_bry(); bfr.Add_byte(Byte_ascii.Angle_bgn).Add(name); @@ -280,7 +280,7 @@ public class Xoh_html_wtr { bfr.Add(Tag__end_bgn).Add(name).Add_byte(Byte_ascii.Angle_end); break; } - case Xop_xnde_tag_.Tid_li: { + case Xop_xnde_tag_.Tid__li: { byte[] name = tag.Name_bry(); int bfr_len = bfr.Len(); if (bfr_len > 0 && bfr.Bfr()[bfr_len - 1] != Byte_ascii.Nl) bfr.Add_byte_nl(); // NOTE: always add nl before li else some lists will merge and force long horizontal bar; EX:w:Music @@ -294,49 +294,52 @@ public class Xoh_html_wtr { bfr.Add(Tag__end_bgn).Add(name).Add_byte(Byte_ascii.Angle_end); // NOTE: inline is never written as ; will be written as ; SEE: NOTE_1 break; } - case Xop_xnde_tag_.Tid_timeline: { + case Xop_xnde_tag_.Tid__timeline: { bfr.Add_str_a7("
");
 				Xox_mgr_base.Xtn_write_escape(app, bfr, src, xnde.Tag_open_end(), xnde.Tag_close_bgn());	// NOTE: do not embed  tag inside pre, else timeline will render in black; EX:
a
will fail; DATE:2014-05-22 bfr.Add_str_a7("
"); break; } - case Xop_xnde_tag_.Tid_gallery: - case Xop_xnde_tag_.Tid_poem: - case Xop_xnde_tag_.Tid_hiero: - case Xop_xnde_tag_.Tid_score: - case Xop_xnde_tag_.Tid_ref: - case Xop_xnde_tag_.Tid_references: - case Xop_xnde_tag_.Tid_inputBox: - case Xop_xnde_tag_.Tid_imageMap: - case Xop_xnde_tag_.Tid_pages: - case Xop_xnde_tag_.Tid_pagequality: - case Xop_xnde_tag_.Tid_pagelist: - case Xop_xnde_tag_.Tid_section: - case Xop_xnde_tag_.Tid_translate: - case Xop_xnde_tag_.Tid_dynamicPageList: - case Xop_xnde_tag_.Tid_languages: - case Xop_xnde_tag_.Tid_templateData: - case Xop_xnde_tag_.Tid_source: // DATE:2015-09-29 - case Xop_xnde_tag_.Tid_syntaxHighlight: - case Xop_xnde_tag_.Tid_listing_buy: - case Xop_xnde_tag_.Tid_listing_do: - case Xop_xnde_tag_.Tid_listing_drink: - case Xop_xnde_tag_.Tid_listing_eat: - case Xop_xnde_tag_.Tid_listing_listing: - case Xop_xnde_tag_.Tid_listing_see: - case Xop_xnde_tag_.Tid_listing_sleep: - case Xop_xnde_tag_.Tid_xowa_cmd: - case Xop_xnde_tag_.Tid_rss: - case Xop_xnde_tag_.Tid_quiz: - case Xop_xnde_tag_.Tid_math: - case Xop_xnde_tag_.Tid_indicator: - case Xop_xnde_tag_.Tid_xowa_html: - case Xop_xnde_tag_.Tid_graph: + case Xop_xnde_tag_.Tid__gallery: + case Xop_xnde_tag_.Tid__poem: + case Xop_xnde_tag_.Tid__hiero: + case Xop_xnde_tag_.Tid__score: + case Xop_xnde_tag_.Tid__ref: + case Xop_xnde_tag_.Tid__references: + case Xop_xnde_tag_.Tid__inputBox: + case Xop_xnde_tag_.Tid__imageMap: + case Xop_xnde_tag_.Tid__pages: + case Xop_xnde_tag_.Tid__pagequality: + case Xop_xnde_tag_.Tid__pagelist: + case Xop_xnde_tag_.Tid__section: + case Xop_xnde_tag_.Tid__translate: + case Xop_xnde_tag_.Tid__dynamicPageList: + case Xop_xnde_tag_.Tid__languages: + case Xop_xnde_tag_.Tid__templateData: + case Xop_xnde_tag_.Tid__source: // DATE:2015-09-29 + case Xop_xnde_tag_.Tid__syntaxHighlight: + case Xop_xnde_tag_.Tid__listing_buy: + case Xop_xnde_tag_.Tid__listing_do: + case Xop_xnde_tag_.Tid__listing_drink: + case Xop_xnde_tag_.Tid__listing_eat: + case Xop_xnde_tag_.Tid__listing_listing: + case Xop_xnde_tag_.Tid__listing_see: + case Xop_xnde_tag_.Tid__listing_sleep: + case Xop_xnde_tag_.Tid__xowa_cmd: + case Xop_xnde_tag_.Tid__rss: + case Xop_xnde_tag_.Tid__quiz: + case Xop_xnde_tag_.Tid__math: + case Xop_xnde_tag_.Tid__indicator: + case Xop_xnde_tag_.Tid__xowa_html: + case Xop_xnde_tag_.Tid__graph: + case Xop_xnde_tag_.Tid__random_selection: + case Xop_xnde_tag_.Tid__tabber: + case Xop_xnde_tag_.Tid__tabview: Xox_xnde xtn = xnde.Xnde_xtn(); xtn.Xtn_write(bfr, app, ctx, this, hctx, xnde, src); break; - case Xop_xnde_tag_.Tid_xowa_tag_bgn: - case Xop_xnde_tag_.Tid_xowa_tag_end: + case Xop_xnde_tag_.Tid__xowa_tag_bgn: + case Xop_xnde_tag_.Tid__xowa_tag_end: break; default: // unknown tag if (tag.Restricted()) { // a; img; script; etc.. @@ -460,9 +463,9 @@ public class Xoh_html_wtr { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn sub_xnde = (Xop_xnde_tkn)sub; switch (sub_xnde.Tag().Id()) { - case Xop_xnde_tag_.Tid_noinclude: - case Xop_xnde_tag_.Tid_onlyinclude: - case Xop_xnde_tag_.Tid_includeonly: + case Xop_xnde_tag_.Tid__noinclude: + case Xop_xnde_tag_.Tid__onlyinclude: + case Xop_xnde_tag_.Tid__includeonly: break; default: byte[] tag_name = sub_xnde.Tag().Name_bry(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java index f995e00dd..904cd12dc 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_escaper.java @@ -30,7 +30,7 @@ public class Xoh_html_wtr_escaper { switch (b) { case Byte_ascii.Lt: if (nowiki_skip) { - byte[] nowiki_name = Xop_xnde_tag_.Tag_nowiki.Name_bry(); + byte[] nowiki_name = Xop_xnde_tag_.Tag__nowiki.Name_bry(); int nowiki_name_len = nowiki_name.length; if (Bry_.Eq(src, i + 1, i + 1 + nowiki_name_len, nowiki_name)) { // . */ package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; public class Xoh_hzip_dict { - } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java index 912571877..0725118c5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java @@ -36,7 +36,7 @@ public class Xoh_stat_tbl implements Rls_able { conn.Stmt_delete(tbl_name).Exec_delete(); // always zap table conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_page_id)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_page_id)));} public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr_fxt.java index c30580875..d225b87a6 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr_fxt.java @@ -22,8 +22,8 @@ class Xoh_make_mgr_fxt { private final Xoh_page hpg = new Xoh_page(); private Xoh_make_mgr hswap_mgr; private Xowe_wiki wiki; public void Clear() { - Xoae_app app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); this.wiki.Init_by_wiki(); this.hswap_mgr = wiki.Html__hdump_mgr().Load_mgr().Make_mgr(); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java index b57fd9e8f..2742ac74f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java @@ -29,17 +29,17 @@ public class Xoh_hdoc_ctx { public Xoa_app App() {return app;} private Xoa_app app; public byte[] Wiki__domain_bry() {return wiki__domain_bry;} private byte[] wiki__domain_bry; public Xow_ttl_parser Wiki__ttl_parser() {return wiki__ttl_parser;} private Xow_ttl_parser wiki__ttl_parser; - public Xoa_url_parser Wiki__url_parser() {return wiki__url_parser;} private Xoa_url_parser wiki__url_parser; + public Xow_url_parser Wiki__url_parser() {return wiki__url_parser;} private Xow_url_parser wiki__url_parser; public boolean Xwiki_mgr__missing(byte[] domain){return app.Xwiki_mgr__missing(domain);} public Xou_cache_finder File__mgr() {return file__mgr;} private Xou_cache_finder file__mgr = Xou_cache_finder_.Noop; - public Xof_url_bldr File__url_bldr() {return file__url_bldr;} private final Xof_url_bldr file__url_bldr = new Xof_url_bldr(); + public Xof_url_bldr File__url_bldr() {return file__url_bldr;} private final Xof_url_bldr file__url_bldr = new Xof_url_bldr(); public byte[] Page__url() {return page__url;} private byte[] page__url; - public Xoh_pool_mgr__hzip Pool_mgr__hzip() {return pool_mgr__hzip;} private final Xoh_pool_mgr__hzip pool_mgr__hzip = new Xoh_pool_mgr__hzip(); - public Xoh_pool_mgr__data Pool_mgr__data() {return pool_mgr__data;} private final Xoh_pool_mgr__data pool_mgr__data = new Xoh_pool_mgr__data(); - public Xoh_pool_mgr__wtr Pool_mgr__wtr() {return pool_mgr__wtr;} private final Xoh_pool_mgr__wtr pool_mgr__wtr = new Xoh_pool_mgr__wtr(); - public Xoh_stat_itm Hzip__stat() {return hzip__stat;} private final Xoh_stat_itm hzip__stat = new Xoh_stat_itm(); - public Xohz_tag_regy Hzip__xnde__regy() {return hzip__xnde__regy;} private final Xohz_tag_regy hzip__xnde__regy = Xohz_tag_regy_.New_dflt(); - public Xoh_xnde_dict_reg Hzip__xnde__dict() {return hzip__xnde__dict;} private final Xoh_xnde_dict_reg hzip__xnde__dict = new Xoh_xnde_dict_reg(); + public Xoh_pool_mgr__hzip Pool_mgr__hzip() {return pool_mgr__hzip;} private final Xoh_pool_mgr__hzip pool_mgr__hzip = new Xoh_pool_mgr__hzip(); + public Xoh_pool_mgr__data Pool_mgr__data() {return pool_mgr__data;} private final Xoh_pool_mgr__data pool_mgr__data = new Xoh_pool_mgr__data(); + public Xoh_pool_mgr__wtr Pool_mgr__wtr() {return pool_mgr__wtr;} private final Xoh_pool_mgr__wtr pool_mgr__wtr = new Xoh_pool_mgr__wtr(); + public Xoh_stat_itm Hzip__stat() {return hzip__stat;} private final Xoh_stat_itm hzip__stat = new Xoh_stat_itm(); + public Xohz_tag_regy Hzip__xnde__regy() {return hzip__xnde__regy;} private final Xohz_tag_regy hzip__xnde__regy = Xohz_tag_regy_.New_dflt(); + public Xoh_xnde_dict_reg Hzip__xnde__dict() {return hzip__xnde__dict;} private final Xoh_xnde_dict_reg hzip__xnde__dict = new Xoh_xnde_dict_reg(); public int Uid__lnki_nxt() {return ++uid__lnki;} private int uid__lnki; public int Uid__gly__nxt() {return ++uid__gly;} private int uid__gly; public boolean Mode_is_diff() {return mode_is_diff;} private boolean mode_is_diff; public void Mode_is_diff_(boolean v) {mode_is_diff = v;} @@ -69,5 +69,5 @@ public class Xoh_hdoc_ctx { this.uid__gly = -1; } public static final int Invalid = -1; - private static final byte[] Fsys__res__drd = Bry_.new_a7("file:///android_asset/xowa/"); + private static final byte[] Fsys__res__drd = Bry_.new_a7("file:///android_asset/xowa/"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java index d3b8f6e08..e3f2686a9 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java @@ -16,8 +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.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.langs.htmls.*; -import gplx.xowa.htmls.core.hzips.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_hzip_fxt { private final Xowe_wiki wiki; private final Xop_fxt parser_fxt = new Xop_fxt(); @@ -26,7 +25,6 @@ public class Xoh_hzip_fxt { private final Xoh_page hpg = new Xoh_page(); private boolean mode_is_b256; public Xoh_hzip_fxt() { - gplx.core.envs.Op_sys.Cur_is_drd_(); // force drd mode; needed for img_bare this.wiki = parser_fxt.Wiki(); Xoa_app_fxt.repo2_(parser_fxt.App(), wiki); // needed else will be old "mem/wiki/repo/trg/thumb/" instead of standard "mem/file/en.wikipedia.org/thumb/" wiki.Html__hdump_mgr().Init_by_db(parser_fxt.Wiki()); @@ -39,7 +37,7 @@ public class Xoh_hzip_fxt { public void Clear() {hpg.Clear();} public void Init_wiki_installed(String domain) {parser_fxt.Init_xwiki_add_user_(domain);} public Xowe_wiki Init_wiki_alias(String alias, String domain) { - Xowe_wiki rv = Xoa_app_fxt.wiki_(parser_fxt.App(), domain); + Xowe_wiki rv = Xoa_app_fxt.Make__wiki__edit(parser_fxt.App(), domain); parser_fxt.Wiki().Xwiki_mgr().Add_by_atrs(Bry_.new_u8(alias), Bry_.new_u8(domain), null); return rv; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java index a84d38a9c..32e0aa01b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java @@ -25,8 +25,8 @@ public abstract class Xoh_itm_parser_fxt { protected byte[] src; protected int src_len; protected final Xoh_hdoc_ctx hctx = new Xoh_hdoc_ctx(); public Xoh_itm_parser_fxt() { - this.app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); + this.app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); hctx.Init_by_app(app); } private Xoh_itm_parser Parser() {return Parser_get();} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__href.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__href.java index fb447bd7b..aed6944d1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__href.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__href.java @@ -17,36 +17,36 @@ along with this program. If not, see . */ //namespace gplx.xowa.htmls.core.wkrs.bfr_args { // using gplx.xowa.htmls.hrefs; using gplx.xowa.wikis.nss; -// public class Bfr_arg__href : gplx.core.brys.Bfr_arg_clearable { -// private byte[] val; private int val_bgn, val_end; -// private int href_type; -//// public void Clear() { -//// href_type = Tid__null; -//// } -// public void Set_by_atr(gplx.langs.htmls.docs.Gfh_atr atr) {Set_by_mid(atr.Src(), atr.Val_bgn(), atr.Val_end());} -// public void Set_by_mid(byte[] v, int bgn, int end) {this.val = v; this.href_type = Tid__mid; this.val_bgn = bgn; this.val_end = end;} -// public void Set_by_raw(byte[] v) {this.val = v; this.href_type = Tid__raw;} -// public void Set_by_page(byte[] v) {this.val = v; this.href_type = Tid__page;} -// public void Set_by_file(byte[] v) {this.val = v; this.href_type = Tid__file;} -// public void Bfr_arg__add(Bry_bfr bfr) { -// if (val == null) return; -// switch (href_type) { -// case Tid__raw: -// bfr.Add(val); -// break; -// case Tid__mid: -// bfr.Add_mid(val, val_bgn, val_end); -// break; -// case Tid__page: -// bfr.Add(Xoh_href_.Bry__wiki); // '/wiki/' -// bfr.Add(val); // 'File:A.png' -// break; -// case Tid__file: -// bfr.Add(Xoh_href_.Bry__wiki).Add(Xow_ns_.Bry__file).Add_byte_colon(); -// bfr.Add(val); -// break; -// } -// } -// private static final int Tid__null = 0, Tid__raw = 1, Tid__page = 2, Tid__file = 3, Tid__mid = 4; -// } +// public class Bfr_arg__href : gplx.core.brys.Bfr_arg_clearable { +// private byte[] val; private int val_bgn, val_end; +// private int href_type; +//// public void Clear() { +//// href_type = Tid__null; +//// } +// public void Set_by_atr(gplx.langs.htmls.docs.Gfh_atr atr) {Set_by_mid(atr.Src(), atr.Val_bgn(), atr.Val_end());} +// public void Set_by_mid(byte[] v, int bgn, int end) {this.val = v; this.href_type = Tid__mid; this.val_bgn = bgn; this.val_end = end;} +// public void Set_by_raw(byte[] v) {this.val = v; this.href_type = Tid__raw;} +// public void Set_by_page(byte[] v) {this.val = v; this.href_type = Tid__page;} +// public void Set_by_file(byte[] v) {this.val = v; this.href_type = Tid__file;} +// public void Bfr_arg__add(Bry_bfr bfr) { +// if (val == null) return; +// switch (href_type) { +// case Tid__raw: +// bfr.Add(val); +// break; +// case Tid__mid: +// bfr.Add_mid(val, val_bgn, val_end); +// break; +// case Tid__page: +// bfr.Add(Xoh_href_.Bry__wiki); // '/wiki/' +// bfr.Add(val); // 'File:A.png' +// break; +// case Tid__file: +// bfr.Add(Xoh_href_.Bry__wiki).Add(Xow_ns_.Bry__file).Add_byte_colon(); +// bfr.Add(val); +// break; +// } +// } +// private static final int Tid__null = 0, Tid__raw = 1, Tid__page = 2, Tid__file = 3, Tid__mid = 4; +// } //} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java index aea5decf1..d0f050fa1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java @@ -106,4 +106,4 @@ class Bfr_arg__hatr_gly_style implements Bfr_arg { , Style__frag_2 = Bry_.new_a7("_width:") , Style__frag_3 = Bry_.new_a7("px;") ; -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java index 7d1d8e197..ad8545f2f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java @@ -36,7 +36,6 @@ public class Xoh_gly_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { boolean xtra_style = flag_bldr.Set_as_bool(Flag__ul__xtra_style , data.Xtra_style_exists()); flag_bldr.Set(Flag__gly_tid, data.Gly_tid()); int itms_len = data.Itms__len(); - bfr.Add(hook); Gfo_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); Gfo_hzip_int_.Encode(1, bfr, ul_style_max_w); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip.java index cb0cc9896..c27c730b4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip.java @@ -25,7 +25,6 @@ public class Xoh_img_bare_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { public Gfo_poolable_itm Encode1(Xoh_hzip_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, byte[] src, Object data_obj) { Xoh_img_bare_data data = (Xoh_img_bare_data)data_obj; int img_tid = flag_bldr.Set_as_int(Flag__img_tid , data.Img_tid()); - bfr.Add(hook); Gfo_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); switch (img_tid) { @@ -38,10 +37,8 @@ public class Xoh_img_bare_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { } public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) { Xoh_img_bare_data data = (Xoh_img_bare_data)data_itm; data.Clear(); - int flag = rdr.Read_hzip_int(1); flag_bldr.Decode(flag); int dir_tid = flag_bldr.Get_as_int(Flag__img_tid); - switch (dir_tid) { case Xoh_img_bare_data.Img_tid__hiero: int tag_0_bgn = rdr.Pos(), tag_0_end = rdr.Find_fwd_lr(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java index f7a18f1c0..24afd33fb 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java @@ -16,10 +16,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import org.junit.*; import gplx.xowa.htmls.core.hzips.*; +import org.junit.*; import gplx.core.envs.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_img_bare_hzip__tst { private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); - @Before public void Clear() {fxt.Clear();} + private int prv_os_tid = -1; + @Before public void init() { + fxt.Clear(); + prv_os_tid = Op_sys.Cur().Tid(); + Op_sys.Cur_(Op_sys.Drd.Tid()); // force drd mode; needed for img_bare + } + @After public void term() { + Op_sys.Cur_(prv_os_tid); // revert back to previous mode; otherwise global Op_sys is set to Drd which will cause other tests to fail (notably tidy) + } @Test public void Hiero() { fxt.Test__bicode ( "~(!\"t\"~" diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java index be065e38f..ce29d443b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java @@ -45,7 +45,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { boolean img__alt_diff_from_anch_title = data.Img_alt__diff__anch_title(); boolean file__src_exists = !img_xoimg.Val_dat_exists(); boolean anch_href_diff_file = !img_wo_anch && !Bry_.Match(anch_page.Val(), anch_page.Val_bgn(), anch_page.Val_end(), anch_href.Ttl_page_db()); - boolean img__imap_exists = flag_bldr.Set_as_bool(Flag__img__imap_exists , data.Img_imap_idx() != -1); flag_bldr.Set(Flag__img__wo_anch , img_wo_anch); flag_bldr.Set(Flag__img__is_vid , data.Img_is_vid()); @@ -65,7 +64,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { flag_bldr.Set(Flag__img__cls_tid , img_cls.Cls_tid()); flag_bldr.Set(Flag__anch__href_tid , anch_href.Tid()); // Tfds.Dbg(flag_bldr.Encode(), Array_.To_str(flag_bldr.Val_ary())); - if (wkr_is_root) bfr.Add(hook); Gfo_hzip_int_.Encode(2, bfr, flag_bldr.Encode()); if (img_wo_anch) bfr.Add_hzip_mid(anch_page.Val(), anch_page.Val_bgn(), anch_page.Val_end()); @@ -116,7 +114,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { } public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) { Xoh_img_data data = (Xoh_img_data)data_itm; data.Clear(); - int flag = rdr.Read_hzip_int(2); flag_bldr.Decode(flag); boolean img_imap_exists = flag_bldr.Get_as_bool(Flag__img__imap_exists); boolean img_wo_anch = flag_bldr.Get_as_bool(Flag__img__wo_anch); @@ -154,7 +151,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { byte[] ns_custom_bry = null; if (anch__ns_is_custom) ns_custom_bry = rdr.Read_bry_to(); int img_w = -1, img_h = -1, file_time = -1, file_page = -1; - if (file__src_exists) { img_w = rdr.Read_hzip_int(2) - Gfo_hzip_int_.Neg_1_adj; img_h = rdr.Read_hzip_int(2) - Gfo_hzip_int_.Neg_1_adj; @@ -181,7 +177,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { img_cls_other_end = rdr.Find_fwd_lr(); } int img_imap_idx = img_imap_exists ? rdr.Read_hzip_int(1) : -1; - // transform values boolean anch_rel_is_nofollow = false; if (anch__href_tid == Xoh_anch_href_data.Tid__inet) {// external links should get rel=nofollow @@ -225,7 +220,6 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { } } this.anch_href_bry = tmp_bfr.To_bry_and_clear(); - // NOTE: src must go underneath ttl Xof_url_bldr url_bldr = hctx.File__url_bldr(); url_bldr.Init_by_root(file__repo_is_local ? hctx.Fsys__file__wiki() : hctx.Fsys__file__comm(), Byte_ascii.Slash, false, false, Md5_depth); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java index 80441b7fa..4dea6aaf4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java @@ -27,13 +27,11 @@ public class Xoh_lnke_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { boolean auto_exists = flag_bldr.Set_as_bool(Flag__auto_exists , data.Auto_exists()); boolean capt_exists = flag_bldr.Set_as_bool(Flag__capt_exists , data.Capt_exists()); byte lnke_tid = flag_bldr.Set_as_byte(Flag__lnke_tid , data.Lnke_tid()); - bfr.Add(hook); bfr.Add_hzip_int(1, flag_bldr.Encode()); // add flag bfr.Add_hzip_mid(src, data.Href_bgn(), data.Href_end()); // add href if (auto_exists) bfr.Add_hzip_int(1, data.Auto_id()); // add autonumber if (capt_exists) bfr.Add_hzip_mid(src, data.Capt_bgn(), data.Capt_end()); // add caption - hctx.Hzip__stat().Lnke_add(lnke_tid); return this; } @@ -42,12 +40,10 @@ public class Xoh_lnke_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { boolean auto_exists = flag_bldr.Get_as_bool(Flag__auto_exists); boolean capt_exists = flag_bldr.Get_as_bool(Flag__capt_exists); byte lnke_tid = flag_bldr.Get_as_byte(Flag__lnke_tid); - int href_bgn = rdr.Pos(); int href_end = rdr.Find_fwd_lr(); int auto_id = -1, capt_bgn = -1, capt_end = -1; if (auto_exists) auto_id = rdr.Read_hzip_int(1); if (capt_exists) {capt_bgn = rdr.Pos(); capt_end = rdr.Find_fwd_lr();} - Xoh_lnke_data data = (Xoh_lnke_data)data_itm; data.Init_by_decode(lnke_tid, auto_id, href_bgn, href_end, capt_bgn, capt_end, capt_exists); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java index fab8adfec..4e62b79b1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java @@ -18,83 +18,83 @@ along with this program. If not, see . //namespace gplx.xowa.htmls.core.hzips.wkrs { // using gplx.core.btries; // using gplx.xowa.htmls.core.hzips; -// public class Xoh_hzip_href { -// public void Save(Bry_bfr bfr, Xoh_stat_itm stats, byte[] src, int src_len, int bgn, int pos, byte bgn_quote) { -//// // ignore anchors; EX: "#a" -//// int proto_bgn = pos; -//// int proto_end = Bry_find_.Find_fwd(src, Byte_ascii.Colon, proto_bgn, src_len); -//// byte proto_tid = Tid_proto_other; -//// if (proto_end != Bry_find_.Not_found) { -//// Object proto_obj = proto_trie.Match_exact(src, pos, proto_bgn); -//// if (proto_obj != null) -//// proto_tid = ((Byte_obj_val)proto_obj).Val(); -//// pos = Bry_find_.Find_fwd_while(src, proto_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / -//// } -//// // stats.Lnke_proto_reg(proto_tid, src, proto_bgn, proto_end); -//// -//// int domain_bgn = pos; -//// int domain_end = Bry_find_.Find_fwd(src, Byte_ascii.Slash, domain_bgn, src_len); -//// if (domain_end == Bry_find_.Not_found) // href has no slash; assume entire String is domain EX: "www.a.org" -//// domain_end = Bry_find_.Find_fwd(src, bgn_quote, pos, src_len); -//// -//// int tld_pos = Bry_find_.Find_bwd(src, Byte_ascii.Dot, domain_bgn, src_len); -//// byte tld_tid = Tid_tld_other; -//// if (tld_pos != Bry_find_.Not_found) { -//// Object tld_obj = tld_trie.Match_exact(src, domain_bgn, domain_end); -//// if (tld_obj != null) -//// tld_tid = ((Byte_obj_val)tld_obj).Val(); -//// pos = Bry_find_.Find_fwd_while(src, domain_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / -//// } -//// // stats.Lnke_tld_reg(tld_tid, src, domain_bgn, domain_end); -// } -// public static final byte // 2 -// Tid_proto_other = 0 -// , Tid_proto_http = 1 -// , Tid_proto_https = 2 -// ; -// public static final byte // 3 -// Tid_tld_other = 0 -// , Tid_tld_com = 1 -// , Tid_tld_org = 2 -// , Tid_tld_net = 3 -// , Tid_tld_gov = 4 -// ; -// public static final byte // 3 -// Tid_ext_other = 0 -// , Tid_ext_none = 1 -// , Tid_ext_htm = 2 -// , Tid_ext_html = 3 -// , Tid_ext_php = 4 -// , Tid_ext_jsp = 5 -// , Tid_ext_asp = 6 -// , Tid_ext_aspx = 7 -// ; -//// 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_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_a7() -//// .Add_str_byte("htm", Tid_ext_htm) -//// .Add_str_byte("html", Tid_ext_html) -//// .Add_str_byte("php", Tid_ext_php) -//// .Add_str_byte("jsp", Tid_ext_jsp) -//// .Add_str_byte("asp", Tid_ext_asp) -//// .Add_str_byte("aspx", Tid_ext_aspx) -//// ; -// // e // xwiki [[simple:xx -// // "Descriptor Terms (Feature Types)" -// /* -// 0: proto,tld,ext -// 1-n: domain -// n: 0: domain_end -// n: url remainder -// n: 0: url_end -// */ -// } +// public class Xoh_hzip_href { +// public void Save(Bry_bfr bfr, Xoh_stat_itm stats, byte[] src, int src_len, int bgn, int pos, byte bgn_quote) { +//// // ignore anchors; EX: "#a" +//// int proto_bgn = pos; +//// int proto_end = Bry_find_.Find_fwd(src, Byte_ascii.Colon, proto_bgn, src_len); +//// byte proto_tid = Tid_proto_other; +//// if (proto_end != Bry_find_.Not_found) { +//// Object proto_obj = proto_trie.Match_exact(src, pos, proto_bgn); +//// if (proto_obj != null) +//// proto_tid = ((Byte_obj_val)proto_obj).Val(); +//// pos = Bry_find_.Find_fwd_while(src, proto_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / +//// } +//// // stats.Lnke_proto_reg(proto_tid, src, proto_bgn, proto_end); +//// +//// int domain_bgn = pos; +//// int domain_end = Bry_find_.Find_fwd(src, Byte_ascii.Slash, domain_bgn, src_len); +//// if (domain_end == Bry_find_.Not_found) // href has no slash; assume entire String is domain EX: "www.a.org" +//// domain_end = Bry_find_.Find_fwd(src, bgn_quote, pos, src_len); +//// +//// int tld_pos = Bry_find_.Find_bwd(src, Byte_ascii.Dot, domain_bgn, src_len); +//// byte tld_tid = Tid_tld_other; +//// if (tld_pos != Bry_find_.Not_found) { +//// Object tld_obj = tld_trie.Match_exact(src, domain_bgn, domain_end); +//// if (tld_obj != null) +//// tld_tid = ((Byte_obj_val)tld_obj).Val(); +//// pos = Bry_find_.Find_fwd_while(src, domain_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / +//// } +//// // stats.Lnke_tld_reg(tld_tid, src, domain_bgn, domain_end); +// } +// public static final byte // 2 +// Tid_proto_other = 0 +// , Tid_proto_http = 1 +// , Tid_proto_https = 2 +// ; +// public static final byte // 3 +// Tid_tld_other = 0 +// , Tid_tld_com = 1 +// , Tid_tld_org = 2 +// , Tid_tld_net = 3 +// , Tid_tld_gov = 4 +// ; +// public static final byte // 3 +// Tid_ext_other = 0 +// , Tid_ext_none = 1 +// , Tid_ext_htm = 2 +// , Tid_ext_html = 3 +// , Tid_ext_php = 4 +// , Tid_ext_jsp = 5 +// , Tid_ext_asp = 6 +// , Tid_ext_aspx = 7 +// ; +//// 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_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_a7() +//// .Add_str_byte("htm", Tid_ext_htm) +//// .Add_str_byte("html", Tid_ext_html) +//// .Add_str_byte("php", Tid_ext_php) +//// .Add_str_byte("jsp", Tid_ext_jsp) +//// .Add_str_byte("asp", Tid_ext_asp) +//// .Add_str_byte("aspx", Tid_ext_aspx) +//// ; +// // e // xwiki [[simple:xx +// // "Descriptor Terms (Feature Types)" +// /* +// 0: proto,tld,ext +// 1-n: domain +// n: 0: domain_end +// n: url remainder +// n: 0: url_end +// */ +// } //} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java index e409dca4b..1c305d255 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java @@ -40,7 +40,6 @@ public class Xoh_lnki_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { flag_bldr.Set_as_int(Flag__capt_cs0_tid , data.Capt_itm().Cs0_tid()); byte text_type = flag_bldr.Set_as_byte(Flag__text_type , data.Text_tid()); // Tfds.Dbg(flag_bldr.Encode(), Array_.To_str(flag_bldr.Val_ary()), text_type); - int bfr_bgn = bfr.Len(); int flag = flag_bldr.Encode(); bfr.Add(hook); @@ -60,7 +59,6 @@ public class Xoh_lnki_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { break; } if (title_tid == Xoh_lnki_data.Title__diff) bfr.Add_hzip_mid(src, data.Title_bgn(), data.Title_end()); - hctx.Hzip__stat().Lnki_add(data.Src_end() - data.Src_bgn(), bfr.Len() - bfr_bgn, flag); return this; } @@ -77,7 +75,6 @@ public class Xoh_lnki_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { int capt_cs0_tid = flag_bldr.Get_as_int(Flag__capt_cs0_tid); byte text_type = flag_bldr.Get_as_byte(Flag__text_type); // Tfds.Dbg(cls_tid, title_missing_ns, ttl_is_main_page, ns_custom_exists, title_tid, capt_has_ns, ns_is_not_main, href_type, capt_cs0_tid, text_type); - int site_bgn = -1, site_end = -1; if (href_type == Xoh_anch_href_data.Tid__site) {site_bgn = rdr.Pos(); site_end = rdr.Find_fwd_lr();} int ns_id = ns_is_not_main ? Xoh_lnki_dict_.Ns_decode(rdr) : Xow_ns_.Tid__main; byte[] ns_custom_bry = ns_custom_exists ? rdr.Read_bry_to() : null; @@ -143,7 +140,6 @@ public class Xoh_lnki_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { break; } } - // gen html bfr.Add(Gfh_bldr_.Bry__a_lhs_w_href); switch (href_type) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java index 2a8e647cf..70b47d9bc 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java @@ -36,8 +36,8 @@ class Xoh_anch_capt_itm_fxt { private final Xoh_anch_capt_itm matcher = new Xoh_anch_capt_itm(); private final Bry_rdr rdr = new Bry_rdr(); public Xoh_anch_capt_itm_fxt() { - Xoae_app app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); } public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki; public void Test__match(String page_str, String capt_str, int expd_tid) {Test__match(page_str, capt_str, expd_tid, -1);} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java index b5644a35e..b39b4d62c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java @@ -293,7 +293,7 @@ public class Xoh_file_wtr__image__tst { ( "\"abc\"" )); } - @Test public void Link__lc() { // links to items in same namespace should automatically title-case words; DATE:2016-01-11 + @Test public void Link__lc() { // links to items in same Srch_rslt_cbk should automatically title-case words; DATE:2016-01-11 fxt.Init_xwiki_add_wiki_and_user_("en", "en.wikipedia.org"); fxt.Test_parse_page_wiki_str ( "[[File:A.png|11px|link=en:Help:a?b=c#d|abc]]", String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java index b9d104a13..7ebcc1462 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java @@ -48,7 +48,7 @@ public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg { default: // all other tkns, just iterate over subs for txt tkns if (tkn.Tkn_tid() == Xop_tkn_itm_.Tid_xnde) { Xop_xnde_tkn xnde = (Xop_xnde_tkn)tkn; - if (xnde.Tag().Id() == Xop_xnde_tag_.Tid_ref) { // if ref, disable tkn + if (xnde.Tag().Id() == Xop_xnde_tag_.Tid__ref) { // if ref, disable tkn gplx.xowa.xtns.cites.Ref_nde ref_xnde = (gplx.xowa.xtns.cites.Ref_nde)xnde.Xnde_xtn(); ref_xnde.Exists_in_lnki_title_(true); // ref found during html_title_wkr's generation; mark ref; will be ignored by references_html_wtr later; DATE:2014-03-05 } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java index 8adea471d..29c86c7ed 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java @@ -88,7 +88,7 @@ public class Xoh_lnki_wtr { private void Write_plain(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xoa_ttl lnki_ttl, Xop_lnki_caption_wtr caption_wkr) { byte[] ttl_bry = lnki.Ttl_ary(); if (Bry_.Len_eq_0(ttl_bry)) ttl_bry = lnki_ttl.Full_txt_raw(); // NOTE: handles ttls like [[fr:]] and [[:fr;]] which have an empty Page_txt, but a valued Full_txt_raw - if (Bry_.Eq(lnki_ttl.Full_txt(), page.Ttl().Full_txt())) { // lnki is same as pagename; bold; SEE: Month widget on day pages will bold current day; PAGE:en.w:January 1 + if (Bry_.Eq(lnki_ttl.Full_txt_by_orig(), page.Ttl().Full_txt_by_orig())) { // lnki is same as pagename; bold; SEE: Month widget on day pages will bold current day; PAGE:en.w:January 1 if (lnki_ttl.Anch_bgn() == -1 && Bry_.Eq(lnki_ttl.Wik_txt(), page.Ttl().Wik_txt())) { // only bold if lnki is not pointing to anchor on same page; PAGE:en.w:Comet; [[Comet#Physical characteristics|ion tail]] bfr.Add(Gfh_tag_.B_lhs); Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); @@ -109,13 +109,19 @@ public class Xoh_lnki_wtr { .Add_int_variable(lnki_html_id); // '1234' } if (cfg.Lnki__title()) { - byte[] title_bry = lnki_ttl.Full_txt(); // NOTE: use Full_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> Roman empire; (c) include ns_name; EX: Help:A -> "title='Help:A'" not "title='A'"; DATE:2015-11-16 + byte[] title_bry = lnki_ttl.Full_txt_w_ttl_case(); // NOTE: use Full_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> Roman empire; (c) include ns_name; EX: Help:A -> "title='Help:A'" not "title='A'"; DATE:2015-11-16 int title_len = title_bry.length; if (title_len > 0) { bfr .Add(Gfh_bldr_.Bry__title__nth); // '" title=\"' Gfh_utl.Escape_html_to_bfr(bfr, title_bry, 0, title_len, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); // escape title; DATE:2014-10-27 } } + if (wiki.Domain_tid() == gplx.xowa.wikis.domains.Xow_domain_tid_.Int__other) { + if (lnki.Target != null) { + bfr.Add_str_a7("\" target=\""); + bfr.Add(lnki.Target); + } + } if (!hctx.Mode_is_hdump()) { // don't write visited for hdump if (cfg.Lnki__visited() && history_mgr.Has(wiki.Domain_bry(), ttl_bry)) @@ -172,8 +178,8 @@ public class Xoh_lnki_wtr { } public static byte[] Lnki_cls_visited(gplx.xowa.users.history.Xou_history_mgr history_mgr, byte[] wiki_key, byte[] page_ttl) { return history_mgr.Has(wiki_key, page_ttl) ? Lnki_cls_visited_bry : Bry_.Empty; - } private static final byte[] Lnki_cls_visited_bry = Bry_.new_a7(" class=\"xowa-visited\""); - private static final byte[] Bry_xowa_visited = Bry_.new_a7("\" class=\"xowa-visited"); + } private static final byte[] Lnki_cls_visited_bry = Bry_.new_a7(" class=\"xowa-visited\""); + private static final byte[] Bry_xowa_visited = Bry_.new_a7("\" class=\"xowa-visited"); public static final int Lnki_id_ignore = 0, Lnki_id_min = 1; } interface Xop_lnki_caption_wtr { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java index a4daae48b..c8e108cb4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java @@ -61,7 +61,6 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { capt_1.Mid_(src, capt_1_bgn, capt_1_end); byte[] capt_2_bry = capt_2_exists ? rdr.Read_bry_to() : Bry_.Empty; byte[] capt_3_bry = capt_3_exists ? rdr.Read_bry_to() : Bry_.Empty; - Xoh_img_data img_data = (Xoh_img_data)hctx.Pool_mgr__data().Get_by_tid(Xoh_hzip_dict_.Tid__img); img_hzip.Decode1(bfr, hdoc_wkr, hctx, hpg, rdr, src, rdr.Pos(), src_end, img_data); img_hzip.Wtr().Init_by_decode(hpg, hctx, src, img_data); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java index 3f13417de..5a75478b8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java @@ -302,16 +302,16 @@ public class Xoh_thm_hzip_tst { , "" )); } - @Test public void Dump() { - Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org"); - gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); - ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); - - fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); - fxt.Wiki().Ns_mgr().Init(); - - fxt.Init_mode_is_b256_(Bool_.N); - fxt.Exec_write_to_fsys(Io_url_.new_dir_("J:\\xowa\\research\\html\\"), "debug.html"); - fxt.Init_mode_is_b256_(Bool_.N); - } +// @Test public void Dump() { +// Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org"); +// gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); +// ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); +// +// fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); +// fxt.Wiki().Ns_mgr().Init(); +// +// fxt.Init_mode_is_b256_(Bool_.N); +// fxt.Exec_write_to_fsys(Io_url_.new_dir_("J:\\xowa\\research\\html\\"), "debug.html"); +// fxt.Init_mode_is_b256_(Bool_.N); +// } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_data.java index 499822c62..33a15097f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_data.java @@ -72,4 +72,4 @@ public class Xoh_thm_caption_data { } public void Capt_3_(int bgn, int end) {this.capt_3_bgn = bgn; this.capt_3_end = end;} public static final byte[] Bry__div_1_tail_bgn = Bry_.new_a7("\n"); -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_data.java index 8dd7dc8bc..8cfa3c367 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_data.java @@ -43,4 +43,4 @@ public class Xoh_thm_magnify_data { return true; } private static final byte[] Cls__magnify = Bry_.new_a7("magnify"); -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java index a395e83ff..cd897247a 100644 --- a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java @@ -62,7 +62,7 @@ public class Xoh_head_mgr implements gplx.core.brys.Bfr_arg { if (page.Hdr_mgr().Toc_enabled()) itm__toc.Enabled_y_(); if (wiki.Html_mgr().Head_mgr().Itm__top_icon().Enabled_y()) itm__top_icon.Enabled_y_(); if (wiki.Html_mgr().Head_mgr().Itm__title_rewrite().Enabled_y()) itm__title_rewrite.Enabled_y_(); - if (app.Gui_mgr().Search_suggest_mgr().Enabled()) itm__search_suggest.Enabled_y_(); + if (app.Gui_mgr().Search_cfg().Enabled()) itm__search_suggest.Enabled_y_(); itm__css.Enabled_y_(); itm__globals.Enabled_y_(); // for now, always mark this and rest as exists; DATE:2014-06-09 itm__collapsible.Enabled_y_(); diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xow_fragment_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/heads/Xow_fragment_mgr_tst.java index 5712ce8ee..5b6d058aa 100644 --- a/400_xowa/src/gplx/xowa/htmls/heads/Xow_fragment_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xow_fragment_mgr_tst.java @@ -43,8 +43,8 @@ public class Xow_fragment_mgr_tst { class Xow_fragment_mgr_fxt { public void Clear() { if (wiki == null) { - Xoae_app app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); } } private Xowe_wiki wiki; public Xol_lang_itm Make_lang(String key) {return wiki.Appe().Lang_mgr().Get_by_or_new(Bry_.new_a7(key));} @@ -54,4 +54,4 @@ class Xow_fragment_mgr_fxt { byte[] actl = (byte[])GfoInvkAble_.InvkCmd(wiki.Fragment_mgr(), key); Tfds.Eq_str_lines(expd, String_.new_u8(actl)); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser.java index 06a047232..40183df83 100644 --- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser.java @@ -64,7 +64,7 @@ public class Xoh_href_parser { if (ttl == null) // invalid ttl; null out page; tmp_page = Bry_.Empty; else - tmp_page = ttl.Full_txt(); + tmp_page = ttl.Full_txt_w_ttl_case(); } } } @@ -73,7 +73,7 @@ public class Xoh_href_parser { } } 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. + 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); diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java index 8eb2fb7c8..163944cee 100644 --- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*; public class Xoh_href_parser_tst { - private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); + 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"); } @@ -115,10 +115,10 @@ public class Xoh_href_parser_tst { // ; // } } -class Xoh_href_parser_fxt extends Xoa_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser(); +class Xoh_href_parser_fxt extends Xow_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; } - private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1"); + private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1"); } diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr_tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr_tst.java index 9e8373ee5..a14a0cf29 100644 --- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr_tst.java @@ -39,8 +39,8 @@ class Xoh_href_wtr_fxt { 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); + this.app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); wiki.Xwiki_mgr().Add_by_csv(Bry_.new_a7("1|wikt|en.wiktionary.org")); app.Usere().Wiki().Xwiki_mgr().Add_by_csv(Bry_.new_a7("1|en.wiktionary.org|en.wiktionary.org")); } diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk.java index 403061b3b..63e206a14 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk.java @@ -25,7 +25,7 @@ public class Xoh_js_cbk implements GfoInvkAble { private Xoae_app app; private Xog_html_itm html_itm; private Xop_root_tkn root = new Xop_root_tkn(); - private final Bry_bfr bfr = Bry_bfr.reset_(255); + private final Bry_bfr bfr = Bry_bfr.reset_(255); public Xoh_js_cbk(Xog_html_itm html_itm) {this.html_itm = html_itm; this.app = html_itm.Owner_tab().Tab_mgr().Win().App();} private String Xowa_exec_test(GfoMsg m) { // concat args with pipe; EX: xowa_exec('proc', 'arg0', 'arg1'); -> proc|arg0|arg1 bfr.Clear(); @@ -91,7 +91,7 @@ public class Xoh_js_cbk implements GfoInvkAble { wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_page, ttl.Ns(), ttl.Page_db()); } return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.To_str(tmp_page.Id()), Int_.To_str(tmp_page.Ns_id()), String_.new_u8(tmp_page.Ttl_page_db()), Bool_.To_str_lower(tmp_page.Redirected()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.To_str(tmp_page.Text_len())); - } private static final Xowd_page_itm tmp_page = Xowd_page_itm.new_tmp(); + } private static final Xowd_page_itm tmp_page = Xowd_page_itm.new_tmp(); private String[][] Get_titles_meta(GfoMsg m) { Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); try { @@ -125,7 +125,9 @@ public class Xoh_js_cbk implements GfoInvkAble { Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); byte[] search_str = Bry_.new_u8((String)m.ReadValAt(0)); byte[] cbk_func = Bry_.new_u8((String)m.ReadValAt(1)); - app.Gui_mgr().Search_suggest_mgr().Search(wiki, search_str, cbk_func); + + + app.Gui_mgr().Search_cfg().Search(wiki, search_str, cbk_func); return ""; } private String[] Wikidata_get_label(GfoMsg m) { @@ -141,7 +143,7 @@ public class Xoh_js_cbk implements GfoInvkAble { for (int i = 1; i < len; i++) { try { byte[] ttl_bry = m.Args_getAt(i).Val_to_bry(); - gplx.xowa.xtns.wdatas.Wdata_doc page = wdata_mgr.Pages_get(ttl_bry); if (page == null) continue; + gplx.xowa.xtns.wdatas.Wdata_doc page = wdata_mgr.Doc_mgr.Get_by_xid_or_null(ttl_bry); if (page == null) continue; for (int j = 0; j < langs_len; j++) { byte[] lang_key = langs[j]; if (Bry_.Eq(lang_key, Wikidata_get_label_xowa_ui_lang)) @@ -170,7 +172,7 @@ public class Xoh_js_cbk implements GfoInvkAble { catch (Exception e) {Err_.Noop(e); return null;} return Object_.Xto_str_strict_or_empty(rv); } - private static final byte[] Wikidata_get_label_xowa_ui_lang = Bry_.new_a7("xowa_ui_lang"), Wikidata_get_label_xowa_title = Bry_.new_a7("xowa_title"); + private static final byte[] Wikidata_get_label_xowa_ui_lang = Bry_.new_a7("xowa_ui_lang"), Wikidata_get_label_xowa_title = Bry_.new_a7("xowa_title"); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_parse_to_html)) return Parse_to_html(m); else if (ctx.Match(k, Invk_wikidata_get_label)) return Wikidata_get_label(m); @@ -188,7 +190,7 @@ public class Xoh_js_cbk implements GfoInvkAble { else if (ctx.Match(k, Invk_exec_json)) return app.Html__bridge_mgr().Cmd_mgr().Exec(m); else return GfoInvkAble_.Rv_unhandled; } - public static final String Invk_parse_to_html = "parse_to_html", Invk_wikidata_get_label = "wikidata_get_label", Invk_get_page = "get_page", Invk_cmd = "cmd", Invk_scripts_exec = "scripts_exec" + public static final String Invk_parse_to_html = "parse_to_html", Invk_wikidata_get_label = "wikidata_get_label", Invk_get_page = "get_page", Invk_cmd = "cmd", Invk_scripts_exec = "scripts_exec" , Invk_get_search_suggestions = "get_search_suggestions", Invk_get_titles_meta = "get_titles_meta", Invk_get_titles_exists = "get_titles_exists", Invk_get_current_url = "get_current_url" , Invk_xowa_exec_test = "xowa_exec_test", Invk_xowa_exec_test_as_array = "xowa_exec_test_as_array" , Invk_popups_get_async_bgn = "popups_get_async_bgn" diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_wdata_labels_tst.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_wdata_labels_tst.java index 0ee72fea2..fce0e75cd 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_wdata_labels_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_wdata_labels_tst.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.xowa.htmls.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import org.junit.*; import gplx.langs.jsons.*; import gplx.xowa.xtns.wdatas.*; public class Xoh_js_cbk_wdata_labels_tst { - @Before public void init() {fxt.Init();} private final Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt(); + @Before public void init() {fxt.Init();} private final Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt(); @Test public void Basic() { - fxt.Init_pages_add(fxt.Wdoc_bldr("q1").Add_label("en", "en_q1").Xto_wdoc()); - fxt.Init_pages_add(fxt.Wdoc_bldr("q2").Add_label("en", "en_q2").Xto_wdoc()); - fxt.Init_pages_add(fxt.Wdoc_bldr("Property:P1").Add_label("en", "en_property_p1").Xto_wdoc()); + fxt.Init__docs__add(fxt.Wdoc_bldr("q1").Add_label("en", "en_q1").Xto_wdoc()); + fxt.Init__docs__add(fxt.Wdoc_bldr("q2").Add_label("en", "en_q2").Xto_wdoc()); + fxt.Init__docs__add(fxt.Wdoc_bldr("Property:P1").Add_label("en", "en_property_p1").Xto_wdoc()); Tst_wikidata_label_get(String_.Ary("en", "q1", "q2", "Property:P1"), String_.Ary("en_q1", "en_q2", "en_property_p1")); } @Test public void Outliers() { - fxt.Init_pages_add(fxt.Wdoc_bldr("q1").Add_label("en", "en_q1").Add_label("de", "de_q1").Xto_wdoc()); + fxt.Init__docs__add(fxt.Wdoc_bldr("q1").Add_label("en", "en_q1").Add_label("de", "de_q1").Xto_wdoc()); Tst_wikidata_label_get(String_.Ary("fr", "q1"), String_.Ary((String)null)); Tst_wikidata_label_get(String_.Ary("de", "q1"), String_.Ary("de_q1")); Tst_wikidata_label_get(String_.Ary("xowa_title", "q1"), String_.Ary("q1")); @@ -41,12 +41,12 @@ public class Xoh_js_cbk_wdata_labels_tst { , " }" , "}" )); - fxt.Init_pages_add(d); + fxt.Init__docs__add(d); Tst_wikidata_label_get(String_.Ary("en", "q1"), String_.Ary("\ta")); } private Wdata_doc doc_(String qid, String src) { Json_doc jdoc = fxt.Make_json(src); - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); Wdata_doc rv = new Wdata_doc(Bry_.new_a7(qid), app.Wiki_mgr().Wdata_mgr(), jdoc); return rv; } diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java index c2516c812..f5a32d121 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner.java @@ -26,7 +26,7 @@ public class Xoh_js_cleaner { if (cleaned != null) { bfr.Del_by(end - bgn); bfr.Add(cleaned); - app.Usr_dlg().Log_many("", "", "javascript detected: wiki=~{0} ~{1}", wiki.Domain_str(), String_.new_u8(ttl.Full_txt())); + app.Usr_dlg().Log_many("", "", "javascript detected: wiki=~{0} ~{1}", wiki.Domain_str(), String_.new_u8(ttl.Full_txt_w_ttl_case())); } } public byte[] Clean(Xowe_wiki wiki, byte[] src, int bgn, int end) { diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner_tst.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner_tst.java index 6bfd88c46..9d479f2ec 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cleaner_tst.java @@ -28,8 +28,8 @@ public class Xoh_js_cleaner_tst { class Xoh_js_cleaner_fxt { public void Init() { if (mgr == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); mgr = app.Html_mgr().Js_cleaner(); } } private Xoae_app app; Xowe_wiki wiki; Xoh_js_cleaner mgr; diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java index eac75611e..bd0fa016b 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java @@ -43,7 +43,7 @@ public class Xow_popup_html_mkr { , hdom_bry , wiki.Lang().Dir_ltr_bry() , page_url - , String_.new_u8(page.Ttl().Full_txt()) + , String_.new_u8(page.Ttl().Full_txt_w_ttl_case()) , popup_itm.Popup_id() , Xow_popup_html_bldr_.Bld_fmtr_wiki(fmtr_wiki, wrdx_bfr, cur_wiki.Domain_bry(), page.Wiki().Domain_bry()) // NOTE: use cur_wiki, not page_wiki; DATE:2014-06-28 , gplx.core.ios.Io_size_.To_str(page.Data_raw().length) @@ -62,7 +62,7 @@ class Xow_popup_html_bldr_ { } public static byte[] Bld_fmtr_viewed(Bry_fmtr fmtr, Xoae_app app, Xowe_wiki wiki, Bry_bfr wrdx_bfr, Xoa_ttl ttl) { byte[] view_time_item = Bry_.Empty; - gplx.xowa.users.history.Xou_history_itm history_itm = app.Usere().History_mgr().Get_or_null(wiki.Domain_bry(), ttl.Full_txt()); + gplx.xowa.users.history.Xou_history_itm history_itm = app.Usere().History_mgr().Get_or_null(wiki.Domain_bry(), ttl.Full_txt_w_ttl_case()); if (history_itm != null) view_time_item = fmtr.Bld_bry_many(wrdx_bfr, history_itm.View_end().XtoStr_fmt_yyyy_MM_dd_HH_mm_ss()); return view_time_item; diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_itm.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_itm.java index 11c19c9a2..f57488c23 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_itm.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_itm.java @@ -25,7 +25,6 @@ public class Xow_popup_itm implements Cancelable { } public boolean Canceled() {return canceled;} private boolean canceled = false; public void Cancel() {canceled = true;} - public void Cancel_reset() {canceled = false;} public byte Mode() {return mode;} private byte mode = Mode_tid_init; public Xow_popup_itm Mode_more_(int more_words) { mode = Mode_tid_more; diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_mgr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_mgr.java index caf1c55d6..e49aa3761 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_mgr.java @@ -21,7 +21,7 @@ import gplx.core.js.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.guis.views.*; import gplx.xowa.htmls.hrefs.*; -import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; +import gplx.xowa.specials.*; import gplx.xowa.apps.apis.xowa.html.modules.*; public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { private Xoae_app app; private Xowe_wiki wiki; private Js_wtr js_wtr = new Js_wtr(); diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java index 37fe7c58e..f77002325 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java @@ -460,8 +460,8 @@ class Xop_popup_parser_fxt { private Xow_popup_parser parser; private Xowe_wiki wiki; private int word_min = 2; public void Clear() { - Xoae_app app = Xoa_app_fxt.app_(); - this.wiki = Xoa_app_fxt.wiki_(app, "en.wiki"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app, "en.wiki"); parser = wiki.Html_mgr().Head_mgr().Popup_mgr().Parser(); parser.Init_by_wiki(wiki); parser.Cfg().Tmpl_read_len_(4); diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java index e5bce4828..590bd67a1 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java @@ -53,20 +53,20 @@ public class Xow_popup_wrdx_mkr { case Xop_tkn_itm_.Tid_xnde: xnde = (Xop_xnde_tkn)tkn; switch (xnde.Tag().Id()) { - case Xop_xnde_tag_.Tid_div: - case Xop_xnde_tag_.Tid_table: case Xop_xnde_tag_.Tid_tr: case Xop_xnde_tag_.Tid_td: case Xop_xnde_tag_.Tid_th: - case Xop_xnde_tag_.Tid_caption: case Xop_xnde_tag_.Tid_thead: case Xop_xnde_tag_.Tid_tfoot: case Xop_xnde_tag_.Tid_tbody: - case Xop_xnde_tag_.Tid_ref: case Xop_xnde_tag_.Tid_gallery: case Xop_xnde_tag_.Tid_imageMap: case Xop_xnde_tag_.Tid_timeline: - case Xop_xnde_tag_.Tid_xowa_html: // needed for Help:Options, else \n at top of doc; DATE:2014-06-22 + case Xop_xnde_tag_.Tid__div: + case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th: + case Xop_xnde_tag_.Tid__caption: case Xop_xnde_tag_.Tid__thead: case Xop_xnde_tag_.Tid__tfoot: case Xop_xnde_tag_.Tid__tbody: + case Xop_xnde_tag_.Tid__ref: case Xop_xnde_tag_.Tid__gallery: case Xop_xnde_tag_.Tid__imageMap: case Xop_xnde_tag_.Tid__timeline: + case Xop_xnde_tag_.Tid__xowa_html: // needed for Help:Options, else \n at top of doc; DATE:2014-06-22 add_tkn = add_subs = false; // skip tblxs xnde = null; break; - case Xop_xnde_tag_.Tid_math: // add as one unit; PAGE:en.w:System_of_polynomial_equations DATE:2014-07-01 + case Xop_xnde_tag_.Tid__math: // add as one unit; PAGE:en.w:System_of_polynomial_equations DATE:2014-07-01 add_subs = false; // never recur xnde = null; data.Words_found_add(tkn); // treat it as one word break; - case Xop_xnde_tag_.Tid_br: + case Xop_xnde_tag_.Tid__br: add_tkn = false; // never add_tkn Src_bgn / Src_end; note add_subs should still be true; PAGE:en.q:Earth; DATE:2014-06-30 if (wrdx_bfr.Len_eq_0()) // don't add
to start of document; needed for Help:Options, but good to have everywhere; DATE:2014-06-22 add_subs = false; diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/keeplists/Xop_keeplist_wiki_tst.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/keeplists/Xop_keeplist_wiki_tst.java index 45ce21788..2e444b8bc 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/keeplists/Xop_keeplist_wiki_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/keeplists/Xop_keeplist_wiki_tst.java @@ -41,8 +41,8 @@ class Xop_keeplist_wiki_fxt { public void Clear() { } public Xop_keeplist_wiki keeplist_wiki_(String raw) { - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "enwiki"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "enwiki"); Xow_popup_mgr popup_mgr = wiki.Html_mgr().Head_mgr().Popup_mgr(); popup_mgr.Init_by_wiki(wiki); popup_mgr.Parser().Tmpl_keeplist_init_(Bry_.new_u8(raw)); diff --git a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java index 480259b3b..a646e29a6 100644 --- a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java @@ -21,11 +21,11 @@ import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.xfers.*; import gplx.xowa.files.origs.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; public class Xoh_ns_file_page_mgr implements gplx.core.brys.Bfr_arg { - private Xoa_ttl ttl; private Xoh_file_page_wtr html_wtr; private final Xoh_file_page__other_resolutions alt_wtr = new Xoh_file_page__other_resolutions(); - private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + private Xoa_ttl ttl; private Xoh_file_page_wtr html_wtr; private final Xoh_file_page__other_resolutions alt_wtr = new Xoh_file_page__other_resolutions(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(); private Xow_repo_mgr repo_mgr; private Xof_file_itm xfer_itm; private byte[] file_size_bry; private byte[] play_btn_icon; - private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); + private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); public void Bld_html(Xowe_wiki cur_wiki, Xop_ctx ctx, Xoae_page page, Bry_bfr bfr, Xoa_ttl ttl, Xoh_file_page_wtr html_wtr, Xof_xfer_queue queue) { Xowe_wiki wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(cur_wiki); this.ttl = ttl; this.html_wtr = html_wtr; this.repo_mgr = wiki.File__repo_mgr(); @@ -59,7 +59,7 @@ public class Xoh_ns_file_page_mgr implements gplx.core.brys.Bfr_arg { public void Bfr_arg__add(Bry_bfr bfr) { alt_wtr.Init_by_fmtr(repo_mgr, xfer_itm, html_wtr); Xof_ext orig_ext = xfer_itm.Orig_ext(); - byte[] alt_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Full_txt()); + byte[] alt_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Full_txt_w_ttl_case()); byte[] xowa_title = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Page_url()); if (orig_ext.Id_is_thumbable_img()) html_wtr.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_url().To_http_file_bry(), file_size_bry, orig_ext.Mime_type() @@ -71,8 +71,8 @@ public class Xoh_ns_file_page_mgr implements gplx.core.brys.Bfr_arg { else if (orig_ext.Id_is_audio()) html_wtr.Html_main_aud().Bld_bfr_many(bfr, xfer_itm.Html_orig_url().To_http_file_bry(), xowa_title, xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); } - private static final byte[] Atr_class_image = Bry_.new_a7("image"); - private static final String Str_commons_notice = String_.Concat_lines_nl_skip_last + private static final byte[] Atr_class_image = Bry_.new_a7("image"); + private static final String Str_commons_notice = String_.Concat_lines_nl_skip_last ( "" , " " , " ; code implicitly relies on td clearing block state, but no td was created + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__table); // NOTE: must clear block state that was started by ; code implicitly relies on td clearing block state, but no td was created return cur_pos; } int acs_typeId = typeId; @@ -418,11 +418,11 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { Xop_tblw_tkn bgn_tkn = (Xop_tblw_tkn)ctx.Stack_pop_til(root, src, acs_pos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_tblw_td); switch (wlxr_type) { case Tblw_type_tb: - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_table); + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__table); break; case Tblw_type_td: case Tblw_type_th: - ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag_td); + ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag__td); break; } bgn_tkn.Subs_move(root); @@ -538,7 +538,7 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { break; case Xop_tkn_itm_.Tid_xnde: if (ws_tkn.Src_bgn() == ws_tkn.Src_end() // NOTE: para_wkr inserts
. these should be disabled in Ignore_ws_rng; they are identified as having bgn == end; normal
s will have bgn < end - && ((Xop_xnde_tkn)ws_tkn).Tag().Id() == Xop_xnde_tag_.Tid_br) + && ((Xop_xnde_tkn)ws_tkn).Tag().Id() == Xop_xnde_tag_.Tid__br) ws_tkn.Ignore_y_grp_(ctx, root, cur); break; default: diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__para_tst.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__para_tst.java index 11811cac2..c9938632b 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__para_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__para_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.parsers.tblws; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_tblw_wkr__para_tst { - @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private final Xop_fxt fxt = new Xop_fxt(); + @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private final Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void Para() { // PURPOSE: para causing strange breaks; SEE:[[John F. Kennedy]] and "two Supreme Court appointments" fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last @@ -58,7 +58,7 @@ public class Xop_tblw_wkr__para_tst { ) ); } - @Test public void Unnecessary_para() { // PURPOSE: tblw causes unnecessary

; [[Help:Download]]; DATE:2014-02-20 + @Test public void Unnecessary_para() { // PURPOSE: tblw causes unnecessary

; home/wiki/Dashboard/Image_databases; DATE:2014-02-20 fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "{|" , "|-" 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 77a9edb8e..94c51d175 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 @@ -34,24 +34,24 @@ public class Xop_tblw_ws_itm { trie_itm(rv, Type_tc, Xop_tblw_lxr_ws.Hook_tc); trie_itm(rv, Type_td, Byte_ascii.Pipe_bry); trie_itm(rv, Type_nl, Byte_ascii.Nl_bry); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_table); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_tr); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_td); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_th); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_blockquote); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h1); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h2); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h3); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h4); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h5); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_h6); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_pre); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_p); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_div); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_hr); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_li); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_ul); - trie_itm_xnde(rv, Xop_xnde_tag_.Tag_ol); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__table); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__tr); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__td); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__th); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__blockquote); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h1); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h2); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h3); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h4); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h5); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__h6); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__pre); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__p); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__div); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__hr); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__li); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__ul); + trie_itm_xnde(rv, Xop_xnde_tag_.Tag__ol); return rv; } private static void trie_itm(Btrie_slim_mgr trie, byte type, byte[] bry) {trie.Add_obj(bry, new Xop_tblw_ws_itm(type, bry.length));} diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Arg_bldr.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Arg_bldr.java index 50cc861d6..f155b314c 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Arg_bldr.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Arg_bldr.java @@ -121,7 +121,7 @@ public class Arg_bldr { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn sub_as_xnde = (Xop_xnde_tkn)sub; switch (sub_as_xnde.Tag().Id()) { - case Xop_xnde_tag_.Tid_noinclude: case Xop_xnde_tag_.Tid_includeonly: case Xop_xnde_tag_.Tid_onlyinclude: + case Xop_xnde_tag_.Tid__noinclude: case Xop_xnde_tag_.Tid__includeonly: case Xop_xnde_tag_.Tid__onlyinclude: itm_is_static = false; break; } 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 43920b1a6..7d7ec674e 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 @@ -54,7 +54,7 @@ public class Nowiki_escape_itm { trie_new_itm(rv, Byte_ascii.Apos_bry , Xop_amp_trie.Bry_xowa_apos); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 trie_new_itm(rv, Byte_ascii.Colon_bry , Xop_amp_trie.Bry_xowa_colon); trie_new_itm(rv, Byte_ascii.Underline_bry , Xop_amp_trie.Bry_xowa_underline); - trie_new_itm(rv, Byte_ascii.Asterisk_bry , Xop_amp_trie.Bry_xowa_asterisk); + trie_new_itm(rv, Byte_ascii.Star_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); diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_subst_tst.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_subst_tst.java index 7cfacf580..727cabcc2 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_subst_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_subst_tst.java @@ -70,11 +70,9 @@ public class Xop_subst_tst { fxt.Init_defn_add("ds", "{{subst:ET|{{subst:ds}}}}"); fxt.Test_parse_page_tmpl_str("{{subst:ds}}", ""); // {{subst:ds}} causes stack overflow; {{ds}} does not } - // NOTE: these are actually not good tests; MW does subst just before save; it doesn't do subst on load; in this case, the tests are testing load (which will noop); they need to test save (which xowa doesn't do) // @Test public void Tmpl_txt_subst() {fxt.Test_parse_tmpl_str_test("{{subst:xo_print|a}}" , "{{test}}" , "a");} // @Test public void Tmpl_txt_subst_prm() {fxt.Test_parse_tmpl_str_test("{{subst:xo_print|{{{1}}}}}" , "{{test|a}}" , "a");} - //@Test public void Tmpl_txt_safesubst_prm() {fxt.Test_parse_tmpl_str_test("{{{{{|safesubst:}}}ns:Category}}" , "{{test}}" , "Category");} //@Test public void Tmpl_txt_subst_immed() {fxt.Test_parse_tmpl_str_test("{{xo_print{{subst:!}}a}}" , "{{test}}" , "a");} } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_mock.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_mock.java index a6dc2f2fe..287d2bf17 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_mock.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_mock.java @@ -56,14 +56,14 @@ public class Xot_invk_mock implements Xot_invk { return Args_get_by_key(src, Bry_.To_a7_bry(idx + 1, 1)); } public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {return (Arg_nde_tkn)args.Get_by(key);} - public static Xot_invk_mock new_(byte defn_tid, byte[] frame_ttl, KeyVal... args) {return new_(defn_tid, 1, frame_ttl, args);} - public static Xot_invk_mock new_(byte[] frame_ttl, KeyVal... args) {return new_(Xot_defn_.Tid_null, 1, frame_ttl, args);} - public static Xot_invk_mock test_(byte[] frame_ttl, KeyVal... args) {return new_(Xot_defn_.Tid_null, 0, frame_ttl, args);} - public static Xot_invk_mock new_(byte defn_tid, int idx_adj, byte[] frame_ttl, KeyVal... args) { + public static Xot_invk_mock new_(byte defn_tid, byte[] frame_ttl, Keyval... args) {return new_(defn_tid, 1, frame_ttl, args);} + public static Xot_invk_mock new_(byte[] frame_ttl, Keyval... args) {return new_(Xot_defn_.Tid_null, 1, frame_ttl, args);} + public static Xot_invk_mock test_(byte[] frame_ttl, Keyval... args) {return new_(Xot_defn_.Tid_null, 0, frame_ttl, args);} + public static Xot_invk_mock new_(byte defn_tid, int idx_adj, byte[] frame_ttl, Keyval... args) { Xot_invk_mock rv = new Xot_invk_mock(defn_tid, idx_adj, frame_ttl); int len = args.length; for (int i = 0; i < len; i++) { - KeyVal kv = args[i]; + Keyval kv = args[i]; String kv_key_str = kv.Key(); Object kv_key_obj = kv.Key_as_obj(); Arg_nde_tkn_mock nde_tkn = null; diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java index b606d93b2..353a7850e 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java @@ -237,9 +237,9 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { rv = true; } catch (Exception e) { if (Env_.Mode_testing()) - throw Err_.new_exc(e, "xo", "failed to evaluate function", "page", ctx.Page().Ttl().Full_txt(), "defn", defn.Name(), "src", String_.new_u8(src, this.Src_bgn(), this.Src_end())); + throw Err_.new_exc(e, "xo", "failed to evaluate function", "page", ctx.Page().Ttl().Full_txt_w_ttl_case(), "defn", defn.Name(), "src", String_.new_u8(src, this.Src_bgn(), this.Src_end())); else { - wiki.Appe().Usr_dlg().Warn_many("", "", "failed to evaluate function: page=~{0} defn=~{1} src=~{2} err=~{3}", ctx.Page().Ttl().Full_txt(), defn.Name(), String_.new_u8(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_log(e)); + wiki.Appe().Usr_dlg().Warn_many("", "", "failed to evaluate function: page=~{0} defn=~{1} src=~{2} err=~{3}", ctx.Page().Ttl().Full_txt_w_ttl_case(), defn.Name(), String_.new_u8(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_log(e)); rv = false; } } @@ -284,7 +284,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { break; } return rv; - } private static final byte[] Ary_unknown_bgn = Bry_.new_a7("(? [["), Ary_unknown_end = Bry_.new_a7("]] ?)"), Ary_dynamic_is_blank = Bry_.new_a7("dynamic is blank"); + } private static final byte[] Ary_unknown_bgn = Bry_.new_a7("(? [["), Ary_unknown_end = Bry_.new_a7("]] ?)"), Ary_dynamic_is_blank = Bry_.new_a7("dynamic is blank"); private boolean Popup_skip(Xop_ctx ctx, byte[] ttl, Bry_bfr bfr) { boolean skip = false; skip = this.Src_end() - this.Src_bgn() > ctx.Tmpl_tkn_max(); @@ -356,7 +356,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { return Eval_sub(ctx, transclude_tmpl, caller, src, bfr); } else { - Print_not_found(bfr, wiki.Ns_mgr(), page_ttl.Full_txt()); + Print_not_found(bfr, wiki.Ns_mgr(), page_ttl.Full_txt_w_ttl_case()); return false; } } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java index c7b962a2e..7c6086c42 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java @@ -53,7 +53,7 @@ public class Xot_tmpl_wtr { Xop_xnde_tkn xnde = (Xop_xnde_tkn)tkn; int xnde_tag_id = xnde.Tag().Id(); switch (xnde_tag_id) { - case Xop_xnde_tag_.Tid_onlyinclude: { + case Xop_xnde_tag_.Tid__onlyinclude: { // NOTE: originally "if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_tmpl) {" but if not needed; Xot_tmpl_wtr should not be called for tmpls and should not make it to page_wiki Bry_bfr tmp_bfr = Bry_bfr.new_(); ctx.Only_include_evaluate_(true); @@ -62,9 +62,9 @@ public class Xot_tmpl_wtr { rslt_bfr.Add_bfr_and_preserve(tmp_bfr); break; } - case Xop_xnde_tag_.Tid_includeonly: // noop; DATE:2014-02-12 + case Xop_xnde_tag_.Tid__includeonly: // noop; DATE:2014-02-12 break; - case Xop_xnde_tag_.Tid_nowiki: { + case Xop_xnde_tag_.Tid__nowiki: { if (xnde.Tag_close_bgn() == Int_.Min_value) rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end else { // NOTE: if nowiki then "deactivate" all xndes by swapping out < for < nowiki_xnde_frag; DATE:2013-01-27 @@ -76,7 +76,7 @@ public class Xot_tmpl_wtr { } break; } - case Xop_xnde_tag_.Tid_xowa_cmd: + case Xop_xnde_tag_.Tid__xowa_cmd: gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd xowa_cmd = (gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd)xnde.Xnde_xtn(); rslt_bfr.Add(xowa_cmd.Xtn_html()); break; diff --git a/400_xowa/src/gplx/xowa/parsers/utils/Xop_redirect_mgr_tst.java b/400_xowa/src/gplx/xowa/parsers/utils/Xop_redirect_mgr_tst.java index 8bf2bcb1e..ee73d2c5b 100644 --- a/400_xowa/src/gplx/xowa/parsers/utils/Xop_redirect_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/utils/Xop_redirect_mgr_tst.java @@ -51,7 +51,7 @@ public class Xop_redirect_mgr_tst { } } class Xop_redirect_mgr_fxt { - private final Xop_fxt fxt = new Xop_fxt(); + private final Xop_fxt fxt = new Xop_fxt(); public void Clear() { fxt.Reset(); } @@ -72,7 +72,7 @@ class Xop_redirect_mgr_fxt { redirect_mgr.Clear(); byte[] raw_bry = Bry_.new_u8(raw_str); Xoa_ttl actl_ttl = redirect_mgr.Extract_redirect(raw_bry); - byte[] actl_bry = actl_ttl == null ? Bry_.Empty : actl_ttl.Full_txt(); + byte[] actl_bry = actl_ttl == null ? Bry_.Empty : actl_ttl.Full_txt_w_ttl_case(); Tfds.Eq(expd_str, String_.new_u8(actl_bry)); } public void Test__redirected_html(String page_str, String expd_str) { diff --git a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_html_doc_wkr.java b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_html_doc_wkr.java index 560576376..edab1888d 100644 --- a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_html_doc_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_html_doc_wkr.java @@ -59,9 +59,9 @@ class Vnt_html_doc_wkr implements Mwh_doc_wkr { } public void On_txt_end (Mwh_doc_parser mgr, byte[] src, int nde_tid, int itm_bgn, int itm_end) { switch (nde_tid) { - case Xop_xnde_tag_.Tid_code: - case Xop_xnde_tag_.Tid_script: - case Xop_xnde_tag_.Tid_pre: + case Xop_xnde_tag_.Tid__code: + case Xop_xnde_tag_.Tid__script: + case Xop_xnde_tag_.Tid__pre: bfr.Add_mid(src, itm_bgn, itm_end); break; default: diff --git a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java index 6cc72c1f6..84a913dd7 100644 --- a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java +++ b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java @@ -63,7 +63,7 @@ public class Vnt_log_tbl implements Rls_able { public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert(int uid, int page_id, int rule_idx, int flag_count, int lang_count, int undi_count, int bidi_count , boolean flag_add, boolean flag_del, boolean flag_aout, boolean flag_hide, boolean flag_raw, boolean flag_show, boolean flag_descrip, boolean flag_name, boolean flag_title, boolean flag_err , int vnt_0, int vnt_1, int vnt_2, int vnt_3, int vnt_4, int vnt_5, int vnt_6, int vnt_7, int vnt_8, int vnt_9 diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr.java index d933a83a5..c722ced63 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr.java @@ -57,70 +57,70 @@ public class Xop_xatr_whitelist_mgr { Ini_grp("tablealign" , null , "align", "char", "charoff", "valign"); Ini_grp("tablecell" , null , "abbr", "axis", "headers", "scope", "rowspan", "colspan", "nowrap", "width", "height", "bgcolor"); - Ini_nde(Xop_xnde_tag_.Tid_div , "block"); - Ini_nde(Xop_xnde_tag_.Tid_center , "common"); - Ini_nde(Xop_xnde_tag_.Tid_span , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h1 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h2 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h3 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h4 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h5 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_h6 , "block"); - Ini_nde(Xop_xnde_tag_.Tid_em , "common"); - Ini_nde(Xop_xnde_tag_.Tid_strong , "common"); - Ini_nde(Xop_xnde_tag_.Tid_cite , "common"); - Ini_nde(Xop_xnde_tag_.Tid_dfn , "common"); - Ini_nde(Xop_xnde_tag_.Tid_code , "common"); - Ini_nde(Xop_xnde_tag_.Tid_samp , "common"); - Ini_nde(Xop_xnde_tag_.Tid_kbd , "common"); - Ini_nde(Xop_xnde_tag_.Tid_var , "common"); - Ini_nde(Xop_xnde_tag_.Tid_abbr , "common"); - Ini_nde(Xop_xnde_tag_.Tid_blockquote , "common", "cite"); - Ini_nde(Xop_xnde_tag_.Tid_sub , "common"); - Ini_nde(Xop_xnde_tag_.Tid_sup , "common"); - Ini_nde(Xop_xnde_tag_.Tid_p , "block"); - Ini_nde(Xop_xnde_tag_.Tid_br , "id", "class", "title", "style", "clear"); - Ini_nde(Xop_xnde_tag_.Tid_pre , "common", "width"); - Ini_nde(Xop_xnde_tag_.Tid_ins , "common", "cite", "datetime"); - Ini_nde(Xop_xnde_tag_.Tid_del , "common", "cite", "datetime"); - Ini_nde(Xop_xnde_tag_.Tid_ul , "common", "type"); - Ini_nde(Xop_xnde_tag_.Tid_ol , "common", "type", "start"); - Ini_nde(Xop_xnde_tag_.Tid_li , "common", "type", "value"); - Ini_nde(Xop_xnde_tag_.Tid_dl , "common"); - Ini_nde(Xop_xnde_tag_.Tid_dd , "common"); - Ini_nde(Xop_xnde_tag_.Tid_dt , "common"); - Ini_nde(Xop_xnde_tag_.Tid_table , "common", "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "align", "bgcolor"); - Ini_nde(Xop_xnde_tag_.Tid_caption , "common", "align"); - Ini_nde(Xop_xnde_tag_.Tid_thead , "common", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_tfoot , "common", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_tbody , "common", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_colgroup , "common", "span", "width", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_col , "common", "span", "width", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_tr , "common", "bgcolor", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_td , "common", "tablecell", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_th , "common", "tablecell", "tablealign"); - Ini_nde(Xop_xnde_tag_.Tid_a , "common", "href", "rel", "rev"); - Ini_nde(Xop_xnde_tag_.Tid_img , "common", "alt", "src", "width", "height"); - Ini_nde(Xop_xnde_tag_.Tid_tt , "common"); - Ini_nde(Xop_xnde_tag_.Tid_b , "common"); - Ini_nde(Xop_xnde_tag_.Tid_i , "common"); - Ini_nde(Xop_xnde_tag_.Tid_big , "common"); - Ini_nde(Xop_xnde_tag_.Tid_small , "common"); - Ini_nde(Xop_xnde_tag_.Tid_strike , "common"); - Ini_nde(Xop_xnde_tag_.Tid_s , "common"); - Ini_nde(Xop_xnde_tag_.Tid_u , "common"); - Ini_nde(Xop_xnde_tag_.Tid_font , "common", "size", "color", "face"); - Ini_nde(Xop_xnde_tag_.Tid_hr , "common", "noshade", "size", "width"); - Ini_nde(Xop_xnde_tag_.Tid_ruby , "common"); - Ini_nde(Xop_xnde_tag_.Tid_rb , "common"); - Ini_nde(Xop_xnde_tag_.Tid_rt , "common"); - Ini_nde(Xop_xnde_tag_.Tid_rp , "common"); - Ini_nde(Xop_xnde_tag_.Tid_math , "class", "style", "id", "title"); - Ini_nde(Xop_xnde_tag_.Tid_time , "class", "datetime"); - Ini_nde(Xop_xnde_tag_.Tid_bdi , "common"); - Ini_nde(Xop_xnde_tag_.Tid_data , "common", "value"); - Ini_nde(Xop_xnde_tag_.Tid_mark , "common"); - Ini_nde(Xop_xnde_tag_.Tid_q , "common"); + Ini_nde(Xop_xnde_tag_.Tid__div , "block"); + Ini_nde(Xop_xnde_tag_.Tid__center , "common"); + Ini_nde(Xop_xnde_tag_.Tid__span , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h1 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h2 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h3 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h4 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h5 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__h6 , "block"); + Ini_nde(Xop_xnde_tag_.Tid__em , "common"); + Ini_nde(Xop_xnde_tag_.Tid__strong , "common"); + Ini_nde(Xop_xnde_tag_.Tid__cite , "common"); + Ini_nde(Xop_xnde_tag_.Tid__dfn , "common"); + Ini_nde(Xop_xnde_tag_.Tid__code , "common"); + Ini_nde(Xop_xnde_tag_.Tid__samp , "common"); + Ini_nde(Xop_xnde_tag_.Tid__kbd , "common"); + Ini_nde(Xop_xnde_tag_.Tid__var , "common"); + Ini_nde(Xop_xnde_tag_.Tid__abbr , "common"); + Ini_nde(Xop_xnde_tag_.Tid__blockquote , "common", "cite"); + Ini_nde(Xop_xnde_tag_.Tid__sub , "common"); + Ini_nde(Xop_xnde_tag_.Tid__sup , "common"); + Ini_nde(Xop_xnde_tag_.Tid__p , "block"); + Ini_nde(Xop_xnde_tag_.Tid__br , "id", "class", "title", "style", "clear"); + Ini_nde(Xop_xnde_tag_.Tid__pre , "common", "width"); + Ini_nde(Xop_xnde_tag_.Tid__ins , "common", "cite", "datetime"); + Ini_nde(Xop_xnde_tag_.Tid__del , "common", "cite", "datetime"); + Ini_nde(Xop_xnde_tag_.Tid__ul , "common", "type"); + Ini_nde(Xop_xnde_tag_.Tid__ol , "common", "type", "start"); + Ini_nde(Xop_xnde_tag_.Tid__li , "common", "type", "value"); + Ini_nde(Xop_xnde_tag_.Tid__dl , "common"); + Ini_nde(Xop_xnde_tag_.Tid__dd , "common"); + Ini_nde(Xop_xnde_tag_.Tid__dt , "common"); + Ini_nde(Xop_xnde_tag_.Tid__table , "common", "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "align", "bgcolor"); + Ini_nde(Xop_xnde_tag_.Tid__caption , "common", "align"); + Ini_nde(Xop_xnde_tag_.Tid__thead , "common", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__tfoot , "common", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__tbody , "common", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__colgroup , "common", "span", "width", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__col , "common", "span", "width", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__tr , "common", "bgcolor", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__td , "common", "tablecell", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__th , "common", "tablecell", "tablealign"); + Ini_nde(Xop_xnde_tag_.Tid__a , "common", "href", "rel", "rev"); + Ini_nde(Xop_xnde_tag_.Tid__img , "common", "alt", "src", "width", "height"); + Ini_nde(Xop_xnde_tag_.Tid__tt , "common"); + Ini_nde(Xop_xnde_tag_.Tid__b , "common"); + Ini_nde(Xop_xnde_tag_.Tid__i , "common"); + Ini_nde(Xop_xnde_tag_.Tid__big , "common"); + Ini_nde(Xop_xnde_tag_.Tid__small , "common"); + Ini_nde(Xop_xnde_tag_.Tid__strike , "common"); + Ini_nde(Xop_xnde_tag_.Tid__s , "common"); + Ini_nde(Xop_xnde_tag_.Tid__u , "common"); + Ini_nde(Xop_xnde_tag_.Tid__font , "common", "size", "color", "face"); + Ini_nde(Xop_xnde_tag_.Tid__hr , "common", "noshade", "size", "width"); + Ini_nde(Xop_xnde_tag_.Tid__ruby , "common"); + Ini_nde(Xop_xnde_tag_.Tid__rb , "common"); + Ini_nde(Xop_xnde_tag_.Tid__rt , "common"); + Ini_nde(Xop_xnde_tag_.Tid__rp , "common"); + Ini_nde(Xop_xnde_tag_.Tid__math , "class", "style", "id", "title"); + Ini_nde(Xop_xnde_tag_.Tid__time , "class", "datetime"); + Ini_nde(Xop_xnde_tag_.Tid__bdi , "common"); + Ini_nde(Xop_xnde_tag_.Tid__data , "common", "value"); + Ini_nde(Xop_xnde_tag_.Tid__mark , "common"); + Ini_nde(Xop_xnde_tag_.Tid__q , "common"); Ini_all_loose("data"); return this; } diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr_tst.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr_tst.java index 7e017671d..ac50567e5 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xatr_whitelist_mgr_tst.java @@ -21,19 +21,19 @@ public class Xop_xatr_whitelist_mgr_tst { private final Xop_xatr_whitelist_fxt fxt = new Xop_xatr_whitelist_fxt(); @Before public void init() {fxt.Clear();} @Test public void Basic() { - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "style" , true); - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "xstyle" , false); - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "stylex" , false); - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "styl" , false); - fxt.Whitelist(Xop_xnde_tag_.Tid_img , "alt" , true); - fxt.Whitelist(Xop_xnde_tag_.Tid_img , "span" , false); - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "data-sort-type" , true); - fxt.Whitelist(Xop_xnde_tag_.Tid_data , "value" , true); - fxt.Whitelist(Xop_xnde_tag_.Tid_data , "valuex" , false); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "style" , true); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "xstyle" , false); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "stylex" , false); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "styl" , false); + fxt.Whitelist(Xop_xnde_tag_.Tid__img , "alt" , true); + fxt.Whitelist(Xop_xnde_tag_.Tid__img , "span" , false); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "data-sort-type" , true); + fxt.Whitelist(Xop_xnde_tag_.Tid__data , "value" , true); + fxt.Whitelist(Xop_xnde_tag_.Tid__data , "valuex" , false); } @Test public void Role() { - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "role" , "presentation", true); - fxt.Whitelist(Xop_xnde_tag_.Tid_div , "role" , "other", false); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "role" , "presentation", true); + fxt.Whitelist(Xop_xnde_tag_.Tid__div , "role" , "other", false); } @Test public void Scrub() { fxt.Scrub_style_fail("expression"); diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag.java index 88503bee8..92f878f4a 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag.java @@ -24,7 +24,7 @@ public class Xop_xnde_tag { this.name_str = name_str; this.name_len = name_bry.length; this.xtn_bgn_tag = Bry_.Add(Byte_ascii.Angle_bgn_bry, name_bry); - this.xtn_end_tag = Bry_.Add(Xop_xnde_tag_.Xtn_end_tag_bgn, name_bry); // always force endtag; needed for + this.xtn_end_tag = Bry_.Add(Xop_xnde_tag_.Bry__end_tag_bgn, name_bry); // always force endtag; needed for this.xtn_end_tag_tmp = new byte[xtn_end_tag.length]; Array_.Copy(xtn_end_tag, xtn_end_tag_tmp); } public int Id() {return id;} private final int id; @@ -36,11 +36,11 @@ public class Xop_xnde_tag { public byte[] Xtn_end_tag_tmp() {return xtn_end_tag_tmp;} private final byte[] xtn_end_tag_tmp; public boolean Xtn() {return xtn;} public Xop_xnde_tag Xtn_() {xtn = true; return this;} private boolean xtn; public boolean Xtn_mw() {return xtn_mw;} public Xop_xnde_tag Xtn_mw_() {xtn_mw = true; xtn = true; return this;} private boolean xtn_mw; // NOTE: Xtn_mw_() marks both xtn and xtn_mw as true - public int Bgn_nde_mode() {return bgn_nde_mode;} private int bgn_nde_mode = Xop_xnde_tag_.Bgn_nde_mode_normal; - public Xop_xnde_tag Bgn_nde_mode_inline_() {bgn_nde_mode = Xop_xnde_tag_.Bgn_nde_mode_inline; return this;} - public int End_nde_mode() {return end_nde_mode;} private int end_nde_mode = Xop_xnde_tag_.End_nde_mode_normal; - public Xop_xnde_tag End_nde_mode_inline_() {end_nde_mode = Xop_xnde_tag_.End_nde_mode_inline; return this;} - public Xop_xnde_tag End_nde_mode_escape_() {end_nde_mode = Xop_xnde_tag_.End_nde_mode_escape; return this;} + public int Bgn_mode() {return bgn_nde_mode;} private int bgn_nde_mode = Xop_xnde_tag_.Bgn_mode__normal; + public Xop_xnde_tag Bgn_mode__inline_() {bgn_nde_mode = Xop_xnde_tag_.Bgn_mode__inline; return this;} + public int End_mode() {return end_nde_mode;} private int end_nde_mode = Xop_xnde_tag_.End_mode__normal; + public Xop_xnde_tag End_mode__inline_() {end_nde_mode = Xop_xnde_tag_.End_mode__inline; return this;} + public Xop_xnde_tag End_mode__escape_() {end_nde_mode = Xop_xnde_tag_.End_mode__escape; return this;} public boolean Single_only() {return single_only;} public Xop_xnde_tag Single_only_() {single_only = true; return this;} private boolean single_only; public boolean Tbl_sub() {return tbl_sub;} public Xop_xnde_tag Tbl_sub_() {tbl_sub = true; return this;} private boolean tbl_sub; public boolean Restricted() {return restricted;} public Xop_xnde_tag Restricted_() {restricted = true; return this;} private boolean restricted; diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java index 6ef22a5da..645ab0726 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java @@ -18,250 +18,256 @@ along with this program. If not, see . package gplx.xowa.parsers.xndes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.langs.*; public class Xop_xnde_tag_ { - public static final int End_nde_mode_normal = 0, End_nde_mode_inline = 1, End_nde_mode_escape = 2; // escape is for hr which does not support - public static final int Bgn_nde_mode_normal = 0, Bgn_nde_mode_inline = 1; - public static final byte[] Name_onlyinclude = Bry_.new_a7("onlyinclude"); - public static final byte[] Xtn_end_tag_bgn = Bry_.new_a7(" + public static final byte[] Bry__onlyinclude = Bry_.new_a7("onlyinclude"); + public static final byte[] Bry__end_tag_bgn = Bry_.new_a7(", , , - Add_itm(trie, Xop_xnde_tag_.Tag_nowiki); - Add_itm(trie, Xop_xnde_tag_.Tag_includeonly); - Add_itm(trie, Xop_xnde_tag_.Tag_noinclude); - Add_itm(trie, Xop_xnde_tag_.Tag_onlyinclude); + Add_itm(trie, Xop_xnde_tag_.Tag__nowiki); + Add_itm(trie, Xop_xnde_tag_.Tag__includeonly); + Add_itm(trie, Xop_xnde_tag_.Tag__noinclude); + Add_itm(trie, Xop_xnde_tag_.Tag__onlyinclude); } } private boolean Ignore_xnde(Hash_adp_bry xtn_hash, Xop_xnde_tag xnde) { return xtn_hash != null // xtn_hash is null during tests or when wiki is not in site_meta_db && xnde.Xtn_mw() // only apply filter to xtn_xnde, not basic_xnde; EX: not

" diff --git a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr_tst.java index 754971e0a..da5b29cd2 100644 --- a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr_tst.java @@ -89,8 +89,8 @@ class Xoh_ns_file_page_mgr_fxt { public Xoh_ns_file_page_mgr_fxt Html_file_size_(int v) {this.html_file_size = v; return this;} private int html_file_size; public void Reset() { if (app != null) return; - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); opt = new Xoh_file_page_wtr(); } public void tst(String expd) { diff --git a/400_xowa/src/gplx/xowa/htmls/portal/Xoh_page_body_cls_tst.java b/400_xowa/src/gplx/xowa/htmls/portal/Xoh_page_body_cls_tst.java index 45b4ceaf0..8b3c1960e 100644 --- a/400_xowa/src/gplx/xowa/htmls/portal/Xoh_page_body_cls_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/portal/Xoh_page_body_cls_tst.java @@ -43,8 +43,8 @@ class Xoh_page_body_cls_fxt { } public void Test_calc(byte page_tid, String ttl_str, String expd) { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); tmp_bfr = Bry_bfr.reset_(255); wiki.Ns_mgr().Add_new(Wdata_wiki_mgr.Ns_property, Wdata_wiki_mgr.Ns_property_name); } diff --git a/400_xowa/src/gplx/xowa/htmls/portal/Xoh_subpages_bldr_tst.java b/400_xowa/src/gplx/xowa/htmls/portal/Xoh_subpages_bldr_tst.java index 84eb62b81..ea504c3a0 100644 --- a/400_xowa/src/gplx/xowa/htmls/portal/Xoh_subpages_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/portal/Xoh_subpages_bldr_tst.java @@ -38,8 +38,8 @@ class Xoh_subpages_bldr_fxt { 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); + this.app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Tid__help).Subpages_enabled_(true); } public void Test_bld(String ttl_str, String expd) { diff --git a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java index a6b804972..7dccde8eb 100644 --- a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java @@ -138,7 +138,7 @@ public class Xow_portal_mgr implements GfoInvkAble { , Invk_missing_ns_cls = "missing_ns_cls", Invk_missing_ns_cls_ = "missing_ns_cls_", Invk_missing_ns_cls_list = "missing_ns_cls_list" ; public static final String Invk_div_logo_ = "div_logo_"; - private static KeyVal[] Options_missing_ns_cls_list = KeyVal_.Ary(KeyVal_.new_("", "Show as blue link"), KeyVal_.new_("new", "Show as red link"), KeyVal_.new_("xowa_display_none", "Hide")); + private static Keyval[] Options_missing_ns_cls_list = Keyval_.Ary(Keyval_.new_("", "Show as blue link"), Keyval_.new_("new", "Show as red link"), Keyval_.new_("xowa_display_none", "Hide")); private static final byte[] Missing_ns_cls_hide = Bry_.new_a7("xowa_display_none"); private static final Bry_fmtr Div_jump_to_fmtr = Bry_fmtr.new_ ( "\n
~{jumpto}~{jumptonavigation}~{comma-separator}~{jumptosearch}
" diff --git a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr_tst.java index 8d317b7fa..b660fa6ac 100644 --- a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr_tst.java @@ -33,8 +33,8 @@ public class Xow_portal_mgr_tst { class Xowh_portal_mgr_fxt { public void Init() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); wiki.Ns_mgr().Ns_main().Exists_(true); // needed for ns wiki.Html_mgr().Portal_mgr().Init_assert(); // needed for personal } diff --git a/400_xowa/src/gplx/xowa/htmls/sidebar/Xowh_sidebar_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/sidebar/Xowh_sidebar_mgr_tst.java index 4f538645f..92e322e43 100644 --- a/400_xowa/src/gplx/xowa/htmls/sidebar/Xowh_sidebar_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/sidebar/Xowh_sidebar_mgr_tst.java @@ -187,8 +187,8 @@ class Xowh_sidebar_mgr_fxt { private Xoae_app app; private Xowe_wiki wiki; private Xowh_sidebar_mgr sidebar_mgr; private Bry_bfr bfr, comment_bfr; public Xowh_sidebar_mgr_fxt Clear() { // if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); sidebar_mgr = wiki.Html_mgr().Portal_mgr().Sidebar_mgr(); bfr = Bry_bfr.reset_(Io_mgr.Len_kb); comment_bfr = Bry_bfr.reset_(Io_mgr.Len_kb); @@ -257,4 +257,4 @@ class Xowh_sidebar_mgr_fxt { sb.Add(Xto_str(cur.Itms_get_at(i))); return sb.To_str_and_clear(); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java index 75cd15887..37daafa67 100644 --- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java @@ -150,19 +150,19 @@ public class Xow_toc_mgr implements gplx.core.brys.Bfr_arg { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn xnde = (Xop_xnde_tkn)sub; switch (xnde.Tag().Id()) { - case Xop_xnde_tag_.Tid_br: // always ignore in TOC text; EX: en.wikipedia.org/wiki/Magnetic_resonance_imaging; ====''T''*
2
-weighted MRI==== - case Xop_xnde_tag_.Tid_hr: // assumed, based on above - case Xop_xnde_tag_.Tid_h1: case Xop_xnde_tag_.Tid_h2: case Xop_xnde_tag_.Tid_h3: case Xop_xnde_tag_.Tid_h4: case Xop_xnde_tag_.Tid_h5: case Xop_xnde_tag_.Tid_h6: - case Xop_xnde_tag_.Tid_ul: case Xop_xnde_tag_.Tid_ol: case Xop_xnde_tag_.Tid_dd: case Xop_xnde_tag_.Tid_dt: case Xop_xnde_tag_.Tid_li: - case Xop_xnde_tag_.Tid_table: case Xop_xnde_tag_.Tid_tr: case Xop_xnde_tag_.Tid_td: case Xop_xnde_tag_.Tid_th: case Xop_xnde_tag_.Tid_thead: case Xop_xnde_tag_.Tid_tbody: case Xop_xnde_tag_.Tid_caption: - case Xop_xnde_tag_.Tid_ref: // NOTE: don't bother printing references -// case Xop_xnde_tag_.Tid_pre: case Xop_xnde_tag_.Tid_blockquote: + case Xop_xnde_tag_.Tid__br: // always ignore in TOC text; EX: en.wikipedia.org/wiki/Magnetic_resonance_imaging; ====''T''*
2
-weighted MRI==== + case Xop_xnde_tag_.Tid__hr: // assumed, based on above + case Xop_xnde_tag_.Tid__h1: case Xop_xnde_tag_.Tid__h2: case Xop_xnde_tag_.Tid__h3: case Xop_xnde_tag_.Tid__h4: case Xop_xnde_tag_.Tid__h5: case Xop_xnde_tag_.Tid__h6: + case Xop_xnde_tag_.Tid__ul: case Xop_xnde_tag_.Tid__ol: case Xop_xnde_tag_.Tid__dd: case Xop_xnde_tag_.Tid__dt: case Xop_xnde_tag_.Tid__li: + case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th: case Xop_xnde_tag_.Tid__thead: case Xop_xnde_tag_.Tid__tbody: case Xop_xnde_tag_.Tid__caption: + case Xop_xnde_tag_.Tid__ref: // NOTE: don't bother printing references +// case Xop_xnde_tag_.Tid__pre: case Xop_xnde_tag_.Tid__blockquote: break; - case Xop_xnde_tag_.Tid_b: - case Xop_xnde_tag_.Tid_i: + case Xop_xnde_tag_.Tid__b: + case Xop_xnde_tag_.Tid__i: html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, src, tkn, Xoh_html_wtr.Sub_idx_null, sub); break; - case Xop_xnde_tag_.Tid_translate: + case Xop_xnde_tag_.Tid__translate: gplx.xowa.xtns.translates.Xop_translate_xnde translate_xnde = (gplx.xowa.xtns.translates.Xop_translate_xnde)xnde.Xnde_xtn(); html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, translate_xnde.Xtn_root().Data_mid(), tkn, Xoh_html_wtr.Sub_idx_null, translate_xnde.Xtn_root()); break; 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 1d9acb360..21536538a 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_lang_itm_.java @@ -269,5 +269,7 @@ kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesincategory_files, "pagesincategory_fil kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_revisionsize, "REVISIONSIZE"); kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_pagebanner, "PAGEBANNER"); // NOTE: must be casematch; EX: in en.v, {{pagebanner}} is actually template name which calls {{PAGEBANNER}} kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_protectionexpiry, "PROTECTIONEXPIRY"); +kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_new_window_link, "#NewWindowLink" +); } } diff --git a/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java b/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java index e125a5682..47c1174fb 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.langs; import gplx.*; import gplx.xowa.*; import gplx.core.lists.*; public class Xol_lang_stub_ { // lists all known stub_ary supported by MW - public static final byte[] Key__unknown = Bry_.Empty; - public static final ComparerAble Comparer_key = new Xol_sub_itm_comparer(); + public static final byte[] Key__unknown = Bry_.Empty; + public static final ComparerAble Comparer_key = new Xol_sub_itm_comparer(); public static final int Id__intl = -2 , Id__unknown = -1 @@ -27,442 +27,444 @@ public class Xol_lang_stub_ { // lists all known stub_ary supported by MW , Id_aa = 1 , Id_ab = 2 , Id_ace = 3 -, Id_ady_cyrl = 4 -, Id_aeb = 5 -, Id_af = 6 -, Id_ak = 7 -, Id_akz = 8 -, Id_aln = 9 -, Id_als = 10 -, Id_am = 11 -, Id_an = 12 -, Id_ang = 13 -, Id_anp = 14 -, Id_ar = 15 -, Id_arc = 16 -, Id_arn = 17 -, Id_aro = 18 -, Id_arq = 19 -, Id_ary = 20 -, Id_arz = 21 -, Id_as = 22 -, Id_ase = 23 -, Id_ast = 24 -, Id_av = 25 -, Id_avk = 26 -, Id_awa = 27 -, Id_ay = 28 -, Id_az = 29 -, Id_azb = 30 -, Id_ba = 31 -, Id_ban = 32 -, Id_bar = 33 -, Id_bat_smg = 34 -, Id_bbc = 35 -, Id_bbc_latn = 36 -, Id_bcc = 37 -, Id_bcl = 38 -, Id_be = 39 -, Id_be_tarask = 40 -, Id_be_x_old = 41 -, Id_bew = 42 -, Id_bg = 43 -, Id_bgn = 44 -, Id_bh = 45 -, Id_bho = 46 -, Id_bi = 47 -, Id_bjn = 48 -, Id_bm = 49 -, Id_bn = 50 -, Id_bo = 51 -, Id_bpy = 52 -, Id_bqi = 53 -, Id_br = 54 -, Id_brh = 55 -, Id_bs = 56 -, Id_bto = 57 -, Id_bug = 58 -, Id_bxr = 59 -, Id_ca = 60 -, Id_cbk_zam = 61 -, Id_cdo = 62 -, Id_ce = 63 -, Id_ceb = 64 -, Id_ch = 65 -, Id_chm = 66 -, Id_cho = 67 -, Id_chr = 68 -, Id_chy = 69 -, Id_ckb = 70 -, Id_co = 71 -, Id_cps = 72 -, Id_cr = 73 -, Id_crh = 74 -, Id_crh_cyrl = 75 -, Id_crh_latn = 76 -, Id_cs = 77 -, Id_csb = 78 -, Id_cu = 79 -, Id_cv = 80 -, Id_cy = 81 -, Id_da = 82 -, Id_de = 83 -, Id_de_at = 84 -, Id_de_ch = 85 -, Id_de_formal = 86 -, Id_diq = 87 -, Id_dsb = 88 -, Id_dtp = 89 -, Id_dv = 90 -, Id_dz = 91 -, Id_ee = 92 -, Id_egl = 93 -, Id_el = 94 -, Id_eml = 95 -, Id_en_ca = 96 -, Id_en_gb = 97 -, Id_en_rtl = 98 -, Id_enrtl = 99 -, Id_eo = 100 -, Id_es = 101 -, Id_es_formal = 102 -, Id_esu = 103 -, Id_et = 104 -, Id_eu = 105 -, Id_ext = 106 -, Id_fa = 107 -, Id_ff = 108 -, Id_fi = 109 -, Id_fit = 110 -, Id_fiu_vro = 111 -, Id_fj = 112 -, Id_fo = 113 -, Id_fr = 114 -, Id_frc = 115 -, Id_frp = 116 -, Id_frr = 117 -, Id_fur = 118 -, Id_fy = 119 -, Id_ga = 120 -, Id_gag = 121 -, Id_gan = 122 -, Id_gan_hans = 123 -, Id_gan_hant = 124 -, Id_gd = 125 -, Id_gl = 126 -, Id_glk = 127 -, Id_gn = 128 -, Id_gom = 129 -, Id_gom_deva = 130 -, Id_gom_latn = 131 -, Id_got = 132 -, Id_grc = 133 -, Id_gsw = 134 -, Id_gu = 135 -, Id_guc = 136 -, Id_gv = 137 -, Id_ha = 138 -, Id_hak = 139 -, Id_haw = 140 -, Id_he = 141 -, Id_hi = 142 -, Id_hif = 143 -, Id_hif_latn = 144 -, Id_hil = 145 -, Id_ho = 146 -, Id_hr = 147 -, Id_hrx = 148 -, Id_hsb = 149 -, Id_hsn = 150 -, Id_ht = 151 -, Id_hu = 152 -, Id_hu_formal = 153 -, Id_hy = 154 -, Id_hz = 155 -, Id_ia = 156 -, Id_id = 157 -, Id_ie = 158 -, Id_ig = 159 -, Id_ii = 160 -, Id_ik = 161 -, Id_ike_cans = 162 -, Id_ike_latn = 163 -, Id_ilo = 164 -, Id_inh = 165 -, Id_io = 166 -, Id_is = 167 -, Id_it = 168 -, Id_iu = 169 -, Id_izh = 170 -, Id_ja = 171 -, Id_jam = 172 -, Id_jbo = 173 -, Id_jut = 174 -, Id_jv = 175 -, Id_ka = 176 -, Id_kaa = 177 -, Id_kab = 178 -, Id_kbd = 179 -, Id_kbd_cyrl = 180 -, Id_kg = 181 -, Id_khw = 182 -, Id_ki = 183 -, Id_kiu = 184 -, Id_kj = 185 -, Id_kk = 186 -, Id_kk_arab = 187 -, Id_kk_cn = 188 -, Id_kk_cyrl = 189 -, Id_kk_kz = 190 -, Id_kk_latn = 191 -, Id_kk_tr = 192 -, Id_kl = 193 -, Id_km = 194 -, Id_kn = 195 -, Id_ko = 196 -, Id_ko_kp = 197 -, Id_koi = 198 -, Id_kr = 199 -, Id_krc = 200 -, Id_kri = 201 -, Id_krj = 202 -, Id_krl = 203 -, Id_ks = 204 -, Id_ks_arab = 205 -, Id_ks_deva = 206 -, Id_ksh = 207 -, Id_ku = 208 -, Id_ku_arab = 209 -, Id_ku_latn = 210 -, Id_kv = 211 -, Id_kw = 212 -, Id_ky = 213 -, Id_la = 214 -, Id_lad = 215 -, Id_lb = 216 -, Id_lbe = 217 -, Id_lez = 218 -, Id_lfn = 219 -, Id_lg = 220 -, Id_li = 221 -, Id_lij = 222 -, Id_liv = 223 -, Id_lmo = 224 -, Id_ln = 225 -, Id_lo = 226 -, Id_loz = 227 -, Id_lrc = 228 -, Id_lt = 229 -, Id_ltg = 230 -, Id_lus = 231 -, Id_luz = 232 -, Id_lv = 233 -, Id_lzh = 234 -, Id_lzz = 235 -, Id_mai = 236 -, Id_map_bms = 237 -, Id_mdf = 238 -, Id_mg = 239 -, Id_mh = 240 -, Id_mhr = 241 -, Id_mi = 242 -, Id_mic = 243 -, Id_min = 244 -, Id_mk = 245 -, Id_ml = 246 -, Id_mn = 247 -, Id_mnc = 248 -, Id_mo = 249 -, Id_mr = 250 -, Id_mrj = 251 -, Id_ms = 252 -, Id_mt = 253 -, Id_mui = 254 -, Id_mus = 255 -, Id_mwl = 256 -, Id_mwv = 257 -, Id_my = 258 -, Id_myv = 259 -, Id_mzn = 260 -, Id_na = 261 -, Id_nah = 262 -, Id_nan = 263 -, Id_nap = 264 -, Id_nb = 265 -, Id_nds = 266 -, Id_nds_nl = 267 -, Id_ne = 268 -, Id_new = 269 -, Id_ng = 270 -, Id_niu = 271 -, Id_nl = 272 -, Id_nl_informal = 273 -, Id_nn = 274 -, Id_no = 275 -, Id_nov = 276 -, Id_nrm = 277 -, Id_nso = 278 -, Id_nv = 279 -, Id_ny = 280 -, Id_oc = 281 -, Id_om = 282 -, Id_or = 283 -, Id_os = 284 -, Id_pa = 285 -, Id_pag = 286 -, Id_pam = 287 -, Id_pap = 288 -, Id_pbb = 289 -, Id_pcd = 290 -, Id_pdc = 291 -, Id_pdt = 292 -, Id_pfl = 293 -, Id_pi = 294 -, Id_pih = 295 -, Id_pl = 296 -, Id_pms = 297 -, Id_pnb = 298 -, Id_pnt = 299 -, Id_ppl = 300 -, Id_prg = 301 -, Id_ps = 302 -, Id_pt = 303 -, Id_pt_br = 304 -, Id_qqq = 305 -, Id_qu = 306 -, Id_qug = 307 -, Id_rap = 308 -, Id_rgn = 309 -, Id_rif = 310 -, Id_rm = 311 -, Id_rmf = 312 -, Id_rmy = 313 -, Id_rn = 314 -, Id_ro = 315 -, Id_roa_rup = 316 -, Id_roa_tara = 317 -, Id_ru = 318 -, Id_rue = 319 -, Id_rup = 320 -, Id_ruq = 321 -, Id_ruq_cyrl = 322 -, Id_ruq_latn = 323 -, Id_rw = 324 -, Id_ryu = 325 -, Id_sa = 326 -, Id_sah = 327 -, Id_sat = 328 -, Id_saz = 329 -, Id_sc = 330 -, Id_scn = 331 -, Id_sco = 332 -, Id_sd = 333 -, Id_sdc = 334 -, Id_sdh = 335 -, Id_se = 336 -, Id_sei = 337 -, Id_ses = 338 -, Id_sg = 339 -, Id_sgs = 340 -, Id_sh = 341 -, Id_shi = 342 -, Id_shn = 343 -, Id_si = 344 -, Id_simple = 345 -, Id_sk = 346 -, Id_sl = 347 -, Id_sli = 348 -, Id_sly = 349 -, Id_sm = 350 -, Id_sma = 351 -, Id_sn = 352 -, Id_so = 353 -, Id_sq = 354 -, Id_sr = 355 -, Id_sr_ec = 356 -, Id_sr_el = 357 -, Id_srn = 358 -, Id_ss = 359 -, Id_st = 360 -, Id_stq = 361 -, Id_su = 362 -, Id_sv = 363 -, Id_sw = 364 -, Id_sxu = 365 -, Id_szl = 366 -, Id_ta = 367 -, Id_tcy = 368 -, Id_te = 369 -, Id_test = 370 -, Id_tet = 371 -, Id_tg = 372 -, Id_tg_cyrl = 373 -, Id_tg_latn = 374 -, Id_th = 375 -, Id_ti = 376 -, Id_tk = 377 -, Id_tl = 378 -, Id_tly = 379 -, Id_tn = 380 -, Id_to = 381 -, Id_tokipona = 382 -, Id_tp = 383 -, Id_tpi = 384 -, Id_tr = 385 -, Id_tru = 386 -, Id_ts = 387 -, Id_tt = 388 -, Id_tt_cyrl = 389 -, Id_tt_latn = 390 -, Id_ttt = 391 -, Id_tum = 392 -, Id_tw = 393 -, Id_ty = 394 -, Id_tyv = 395 -, Id_tzm = 396 -, Id_udm = 397 -, Id_ug = 398 -, Id_ug_arab = 399 -, Id_ug_latn = 400 -, Id_uk = 401 -, Id_ur = 402 -, Id_uz = 403 -, Id_ve = 404 -, Id_vec = 405 -, Id_vep = 406 -, Id_vi = 407 -, Id_vls = 408 -, Id_vmf = 409 -, Id_vo = 410 -, Id_vot = 411 -, Id_vro = 412 -, Id_wa = 413 -, Id_war = 414 -, Id_wo = 415 -, Id_wuu = 416 -, Id_xal = 417 -, Id_xh = 418 -, Id_xmf = 419 -, Id_yi = 420 -, Id_yo = 421 -, Id_yue = 422 -, Id_za = 423 -, Id_zea = 424 -, Id_zh = 425 -, Id_zh_classical = 426 -, Id_zh_cn = 427 -, Id_zh_hans = 428 -, Id_zh_hant = 429 -, Id_zh_hk = 430 -, Id_zh_min_nan = 431 -, Id_zh_mo = 432 -, Id_zh_my = 433 -, Id_zh_sg = 434 -, Id_zh_tw = 435 -, Id_zh_yue = 436 -, Id_zu = 437 +, Id_ady = 4 +, Id_ady_cyrl = 5 +, Id_aeb = 6 +, Id_af = 7 +, Id_ak = 8 +, Id_akz = 9 +, Id_aln = 10 +, Id_als = 11 +, Id_am = 12 +, Id_an = 13 +, Id_ang = 14 +, Id_anp = 15 +, Id_ar = 16 +, Id_arc = 17 +, Id_arn = 18 +, Id_aro = 19 +, Id_arq = 20 +, Id_ary = 21 +, Id_arz = 22 +, Id_as = 23 +, Id_ase = 24 +, Id_ast = 25 +, Id_av = 26 +, Id_avk = 27 +, Id_awa = 28 +, Id_ay = 29 +, Id_az = 30 +, Id_azb = 31 +, Id_ba = 32 +, Id_ban = 33 +, Id_bar = 34 +, Id_bat_smg = 35 +, Id_bbc = 36 +, Id_bbc_latn = 37 +, Id_bcc = 38 +, Id_bcl = 39 +, Id_be = 40 +, Id_be_tarask = 41 +, Id_be_x_old = 42 +, Id_bew = 43 +, Id_bg = 44 +, Id_bgn = 45 +, Id_bh = 46 +, Id_bho = 47 +, Id_bi = 48 +, Id_bjn = 49 +, Id_bm = 50 +, Id_bn = 51 +, Id_bo = 52 +, Id_bpy = 53 +, Id_bqi = 54 +, Id_br = 55 +, Id_brh = 56 +, Id_bs = 57 +, Id_bto = 58 +, Id_bug = 59 +, Id_bxr = 60 +, Id_ca = 61 +, Id_cbk_zam = 62 +, Id_cdo = 63 +, Id_ce = 64 +, Id_ceb = 65 +, Id_ch = 66 +, Id_chm = 67 +, Id_cho = 68 +, Id_chr = 69 +, Id_chy = 70 +, Id_ckb = 71 +, Id_co = 72 +, Id_cps = 73 +, Id_cr = 74 +, Id_crh = 75 +, Id_crh_cyrl = 76 +, Id_crh_latn = 77 +, Id_cs = 78 +, Id_csb = 79 +, Id_cu = 80 +, Id_cv = 81 +, Id_cy = 82 +, Id_da = 83 +, Id_de = 84 +, Id_de_at = 85 +, Id_de_ch = 86 +, Id_de_formal = 87 +, Id_diq = 88 +, Id_dsb = 89 +, Id_dtp = 90 +, Id_dv = 91 +, Id_dz = 92 +, Id_ee = 93 +, Id_egl = 94 +, Id_el = 95 +, Id_eml = 96 +, Id_en_ca = 97 +, Id_en_gb = 98 +, Id_en_rtl = 99 +, Id_enrtl = 100 +, Id_eo = 101 +, Id_es = 102 +, Id_es_formal = 103 +, Id_esu = 104 +, Id_et = 105 +, Id_eu = 106 +, Id_ext = 107 +, Id_fa = 108 +, Id_ff = 109 +, Id_fi = 110 +, Id_fit = 111 +, Id_fiu_vro = 112 +, Id_fj = 113 +, Id_fo = 114 +, Id_fr = 115 +, Id_frc = 116 +, Id_frp = 117 +, Id_frr = 118 +, Id_fur = 119 +, Id_fy = 120 +, Id_ga = 121 +, Id_gag = 122 +, Id_gan = 123 +, Id_gan_hans = 124 +, Id_gan_hant = 125 +, Id_gd = 126 +, Id_gl = 127 +, Id_glk = 128 +, Id_gn = 129 +, Id_gom = 130 +, Id_gom_deva = 131 +, Id_gom_latn = 132 +, Id_got = 133 +, Id_grc = 134 +, Id_gsw = 135 +, Id_gu = 136 +, Id_guc = 137 +, Id_gv = 138 +, Id_ha = 139 +, Id_hak = 140 +, Id_haw = 141 +, Id_he = 142 +, Id_hi = 143 +, Id_hif = 144 +, Id_hif_latn = 145 +, Id_hil = 146 +, Id_ho = 147 +, Id_hr = 148 +, Id_hrx = 149 +, Id_hsb = 150 +, Id_hsn = 151 +, Id_ht = 152 +, Id_hu = 153 +, Id_hu_formal = 154 +, Id_hy = 155 +, Id_hz = 156 +, Id_ia = 157 +, Id_id = 158 +, Id_ie = 159 +, Id_ig = 160 +, Id_ii = 161 +, Id_ik = 162 +, Id_ike_cans = 163 +, Id_ike_latn = 164 +, Id_ilo = 165 +, Id_inh = 166 +, Id_io = 167 +, Id_is = 168 +, Id_it = 169 +, Id_iu = 170 +, Id_izh = 171 +, Id_ja = 172 +, Id_jam = 173 +, Id_jbo = 174 +, Id_jut = 175 +, Id_jv = 176 +, Id_ka = 177 +, Id_kaa = 178 +, Id_kab = 179 +, Id_kbd = 180 +, Id_kbd_cyrl = 181 +, Id_kg = 182 +, Id_khw = 183 +, Id_ki = 184 +, Id_kiu = 185 +, Id_kj = 186 +, Id_kk = 187 +, Id_kk_arab = 188 +, Id_kk_cn = 189 +, Id_kk_cyrl = 190 +, Id_kk_kz = 191 +, Id_kk_latn = 192 +, Id_kk_tr = 193 +, Id_kl = 194 +, Id_km = 195 +, Id_kn = 196 +, Id_ko = 197 +, Id_ko_kp = 198 +, Id_koi = 199 +, Id_kr = 200 +, Id_krc = 201 +, Id_kri = 202 +, Id_krj = 203 +, Id_krl = 204 +, Id_ks = 205 +, Id_ks_arab = 206 +, Id_ks_deva = 207 +, Id_ksh = 208 +, Id_ku = 209 +, Id_ku_arab = 210 +, Id_ku_latn = 211 +, Id_kv = 212 +, Id_kw = 213 +, Id_ky = 214 +, Id_la = 215 +, Id_lad = 216 +, Id_lb = 217 +, Id_lbe = 218 +, Id_lez = 219 +, Id_lfn = 220 +, Id_lg = 221 +, Id_li = 222 +, Id_lij = 223 +, Id_liv = 224 +, Id_lmo = 225 +, Id_ln = 226 +, Id_lo = 227 +, Id_loz = 228 +, Id_lrc = 229 +, Id_lt = 230 +, Id_ltg = 231 +, Id_lus = 232 +, Id_luz = 233 +, Id_lv = 234 +, Id_lzh = 235 +, Id_lzz = 236 +, Id_mai = 237 +, Id_map_bms = 238 +, Id_mdf = 239 +, Id_mg = 240 +, Id_mh = 241 +, Id_mhr = 242 +, Id_mi = 243 +, Id_mic = 244 +, Id_min = 245 +, Id_mk = 246 +, Id_ml = 247 +, Id_mn = 248 +, Id_mnc = 249 +, Id_mo = 250 +, Id_mr = 251 +, Id_mrj = 252 +, Id_ms = 253 +, Id_mt = 254 +, Id_mui = 255 +, Id_mus = 256 +, Id_mwl = 257 +, Id_mwv = 258 +, Id_my = 259 +, Id_myv = 260 +, Id_mzn = 261 +, Id_na = 262 +, Id_nah = 263 +, Id_nan = 264 +, Id_nap = 265 +, Id_nb = 266 +, Id_nds = 267 +, Id_nds_nl = 268 +, Id_ne = 269 +, Id_new = 270 +, Id_ng = 271 +, Id_niu = 272 +, Id_nl = 273 +, Id_nl_informal = 274 +, Id_nn = 275 +, Id_no = 276 +, Id_nov = 277 +, Id_nrm = 278 +, Id_nso = 279 +, Id_nv = 280 +, Id_ny = 281 +, Id_oc = 282 +, Id_om = 283 +, Id_or = 284 +, Id_os = 285 +, Id_pa = 286 +, Id_pag = 287 +, Id_pam = 288 +, Id_pap = 289 +, Id_pbb = 290 +, Id_pcd = 291 +, Id_pdc = 292 +, Id_pdt = 293 +, Id_pfl = 294 +, Id_pi = 295 +, Id_pih = 296 +, Id_pl = 297 +, Id_pms = 298 +, Id_pnb = 299 +, Id_pnt = 300 +, Id_ppl = 301 +, Id_prg = 302 +, Id_ps = 303 +, Id_pt = 304 +, Id_pt_br = 305 +, Id_qqq = 306 +, Id_qu = 307 +, Id_qug = 308 +, Id_rap = 309 +, Id_rgn = 310 +, Id_rif = 311 +, Id_rm = 312 +, Id_rmf = 313 +, Id_rmy = 314 +, Id_rn = 315 +, Id_ro = 316 +, Id_roa_rup = 317 +, Id_roa_tara = 318 +, Id_ru = 319 +, Id_rue = 320 +, Id_rup = 321 +, Id_ruq = 322 +, Id_ruq_cyrl = 323 +, Id_ruq_latn = 324 +, Id_rw = 325 +, Id_ryu = 326 +, Id_sa = 327 +, Id_sah = 328 +, Id_sat = 329 +, Id_saz = 330 +, Id_sc = 331 +, Id_scn = 332 +, Id_sco = 333 +, Id_sd = 334 +, Id_sdc = 335 +, Id_sdh = 336 +, Id_se = 337 +, Id_sei = 338 +, Id_ses = 339 +, Id_sg = 340 +, Id_sgs = 341 +, Id_sh = 342 +, Id_shi = 343 +, Id_shn = 344 +, Id_si = 345 +, Id_simple = 346 +, Id_sk = 347 +, Id_sl = 348 +, Id_sli = 349 +, Id_sly = 350 +, Id_sm = 351 +, Id_sma = 352 +, Id_sn = 353 +, Id_so = 354 +, Id_sq = 355 +, Id_sr = 356 +, Id_sr_ec = 357 +, Id_sr_el = 358 +, Id_srn = 359 +, Id_ss = 360 +, Id_st = 361 +, Id_stq = 362 +, Id_su = 363 +, Id_sv = 364 +, Id_sw = 365 +, Id_sxu = 366 +, Id_szl = 367 +, Id_ta = 368 +, Id_tcy = 369 +, Id_te = 370 +, Id_test = 371 +, Id_tet = 372 +, Id_tg = 373 +, Id_tg_cyrl = 374 +, Id_tg_latn = 375 +, Id_th = 376 +, Id_ti = 377 +, Id_tk = 378 +, Id_tl = 379 +, Id_tly = 380 +, Id_tn = 381 +, Id_to = 382 +, Id_tokipona = 383 +, Id_tp = 384 +, Id_tpi = 385 +, Id_tr = 386 +, Id_tru = 387 +, Id_ts = 388 +, Id_tt = 389 +, Id_tt_cyrl = 390 +, Id_tt_latn = 391 +, Id_ttt = 392 +, Id_tum = 393 +, Id_tw = 394 +, Id_ty = 395 +, Id_tyv = 396 +, Id_tzm = 397 +, Id_ua = 398 +, Id_udm = 399 +, Id_ug = 400 +, Id_ug_arab = 401 +, Id_ug_latn = 402 +, Id_uk = 403 +, Id_ur = 404 +, Id_uz = 405 +, Id_ve = 406 +, Id_vec = 407 +, Id_vep = 408 +, Id_vi = 409 +, Id_vls = 410 +, Id_vmf = 411 +, Id_vo = 412 +, Id_vot = 413 +, Id_vro = 414 +, Id_wa = 415 +, Id_war = 416 +, Id_wo = 417 +, Id_wuu = 418 +, Id_xal = 419 +, Id_xh = 420 +, Id_xmf = 421 +, Id_yi = 422 +, Id_yo = 423 +, Id_yue = 424 +, Id_za = 425 +, Id_zea = 426 +, Id_zh = 427 +, Id_zh_classical = 428 +, Id_zh_cn = 429 +, Id_zh_hans = 430 +, Id_zh_hant = 431 +, Id_zh_hk = 432 +, Id_zh_min_nan = 433 +, Id_zh_mo = 434 +, Id_zh_my = 435 +, Id_zh_sg = 436 +, Id_zh_tw = 437 +, Id_zh_yue = 438 +, Id_zu = 439 ; - public static final int Id__max = 438; + public static final int Id__max = 440; public static Hash_adp_bry Regy() { if (stub_hash == 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 stub_ary. stub_hash = Hash_adp_bry.ci_a7(); // ASCII:lang_code; NOTE: must be ci; EX: {{#languages:FR}} @@ -470,6 +472,7 @@ Regy_add(stub_hash, Id_en, "en", "English"); Regy_add(stub_hash, Id_aa, "aa", "Qafár af"); Regy_add(stub_hash, Id_ab, "ab", "Аҧсуа"); Regy_add(stub_hash, Id_ace, "ace", "Acèh"); +Regy_add(stub_hash, Id_ady, "ady", "Adyghe"); Regy_add(stub_hash, Id_ady_cyrl, "ady-cyrl", "West Circassian (Cyrillic)"); Regy_add(stub_hash, Id_aeb, "aeb", "زَوُن"); Regy_add(stub_hash, Id_af, "af", "Afrikaans"); @@ -863,6 +866,7 @@ Regy_add(stub_hash, Id_tw, "tw", "Twi"); Regy_add(stub_hash, Id_ty, "ty", "Reo Mā`ohi"); Regy_add(stub_hash, Id_tyv, "tyv", "Тыва дыл"); Regy_add(stub_hash, Id_tzm, "tzm", "ⵜⴰⵎⴰⵣⵉⵖⵜ"); +Regy_add(stub_hash, Id_ua, "ua", "Ukrainian"); Regy_add(stub_hash, Id_udm, "udm", "Удмурт"); Regy_add(stub_hash, Id_ug, "ug", "ئۇيغۇرچە / Uyghurche‎"); Regy_add(stub_hash, Id_ug_arab, "ug-arab", "ئۇيغۇرچە"); @@ -907,7 +911,7 @@ Regy_add(stub_hash, Id_zu, "zu", "isiZulu"); } return stub_hash; } - private static Hash_adp_bry stub_hash; private static final Xol_lang_stub[] stub_ary = new Xol_lang_stub[Id__max]; + private static Hash_adp_bry stub_hash; private static final Xol_lang_stub[] stub_ary = new Xol_lang_stub[Id__max]; public static Xol_lang_stub[] Ary() {return stub_ary;} private static void Regy_add(Hash_adp_bry stub_hash, int uid, String code_str, String canonical) { byte[] code = Bry_.new_a7(code_str);// ASCII:lang_code should always be ASCII @@ -931,7 +935,7 @@ Regy_add(stub_hash, Id_zu, "zu", "isiZulu"); Xol_lang_stub rv = Get_by_key_or_null(key, bgn, end); return rv == null ? Intl : rv; } - public static final Xol_lang_stub Intl = new Xol_lang_stub(Xol_lang_stub_.Id__intl, Bry_.Empty, Bry_.Empty); // intended for international wikis like commons, wikidata, etc.. + public static final Xol_lang_stub Intl = new Xol_lang_stub(Xol_lang_stub_.Id__intl, Bry_.Empty, Bry_.Empty); // intended for international wikis like commons, wikidata, etc.. } class Xol_sub_itm_comparer implements ComparerAble { public int compare(Object lhsObj, Object rhsObj) { diff --git a/400_xowa/src/gplx/xowa/langs/bldrs/Xob_i18n_parser_tst.java b/400_xowa/src/gplx/xowa/langs/bldrs/Xob_i18n_parser_tst.java index 1e4550849..16ac15459 100644 --- a/400_xowa/src/gplx/xowa/langs/bldrs/Xob_i18n_parser_tst.java +++ b/400_xowa/src/gplx/xowa/langs/bldrs/Xob_i18n_parser_tst.java @@ -52,8 +52,8 @@ class Xob_i18n_parser_fxt { Tfds.Eq_str_lines(expd, String_.new_u8(actl)); } public void Test_load_msgs_dir(String dir_str) { - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app); Io_url dir_url = Io_url_.new_dir_(dir_str); Io_url[] fil_urls = Io_mgr.Instance.QueryDir_fils(dir_url); int len = fil_urls.length; diff --git a/400_xowa/src/gplx/xowa/langs/bldrs/Xobc_utl_make_lang_tst.java b/400_xowa/src/gplx/xowa/langs/bldrs/Xobc_utl_make_lang_tst.java index 9dca4748f..635544eab 100644 --- a/400_xowa/src/gplx/xowa/langs/bldrs/Xobc_utl_make_lang_tst.java +++ b/400_xowa/src/gplx/xowa/langs/bldrs/Xobc_utl_make_lang_tst.java @@ -145,7 +145,7 @@ class Xobc_utl_make_lang_fxt { public Xobc_utl_make_lang Mgr() {return mgr;} private Xobc_utl_make_lang mgr; public Xobc_utl_make_lang_kwds Kwd_mgr() {return mgr.Kwd_mgr();} public Xobc_utl_make_lang_fxt Clear() { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); mgr = new Xobc_utl_make_lang(app.Lang_mgr(), app.Fsys_mgr(), app.Msg_log()); return this; } private String_bldr sb = String_bldr_.new_(); private Xoae_app app; diff --git a/400_xowa/src/gplx/xowa/langs/bldrs/Xol_mw_lang_parser_tst.java b/400_xowa/src/gplx/xowa/langs/bldrs/Xol_mw_lang_parser_tst.java index ee2346cc1..2c416161b 100644 --- a/400_xowa/src/gplx/xowa/langs/bldrs/Xol_mw_lang_parser_tst.java +++ b/400_xowa/src/gplx/xowa/langs/bldrs/Xol_mw_lang_parser_tst.java @@ -242,11 +242,11 @@ class Xol_mw_lang_parser_fxt { Xol_mw_lang_parser parser = new Xol_mw_lang_parser(Gfo_msg_log.Test()); Bry_bfr tmp_bfr = Bry_bfr.reset_(255); public void Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); } app.Lang_mgr().Clear();// NOTE: always clear the lang lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7("fr")); - wiki = Xoa_app_fxt.wiki_(app, "en.wikipedia.org", lang); + wiki = Xoa_app_fxt.Make__wiki__edit(app, "en.wikipedia.org", lang); fxt = new Xop_fxt(app, wiki); lang.Kwd_mgr().Clear(); lang.Msg_mgr().Clear(); // NOTE: clear kwds and msgs else they will be printed to file; this line must go last b/c various xtns will fill in kwds dynamically } 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 1ac3408fa..425f3a8cc 100644 --- a/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java +++ b/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java @@ -56,12 +56,12 @@ public class Xol_duration_itm_ { , Itm_minutes , Itm_seconds }; - public static Xol_duration_itm[] Xto_itm_ary(KeyVal[] kv_ary) { + public static Xol_duration_itm[] Xto_itm_ary(Keyval[] kv_ary) { if (kv_ary == null) return Xol_duration_itm_.Ary_default; List_adp rv = List_adp_.new_(); int len = kv_ary.length; for (int i = 0; i < len; i++) { - KeyVal kv = kv_ary[i]; + Keyval kv = kv_ary[i]; String name = kv.Val_to_str_or_empty(); Xol_duration_itm itm = (Xol_duration_itm)regy.Get_by(Bry_.new_u8(name)); if (itm != null) diff --git a/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java b/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java index 18ed6b9ab..30665889d 100644 --- a/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java +++ b/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java @@ -20,12 +20,12 @@ public class Xol_interval_itm { public Xol_interval_itm(Xol_duration_itm duration_itm, long val) {this.duration_itm = duration_itm; this.val = val;} public Xol_duration_itm Duration_itm() {return duration_itm;} private Xol_duration_itm duration_itm; public long Val() {return val;} private long val; - public static KeyVal[] Xto_kv_ary(Xol_interval_itm[] ary) { + public static Keyval[] Xto_kv_ary(Xol_interval_itm[] ary) { int len = ary.length; - KeyVal[] rv = new KeyVal[len]; + Keyval[] rv = new Keyval[len]; for (int i = 0; i < len; i++) { Xol_interval_itm itm = ary[i]; - rv[i] = KeyVal_.new_(itm.Duration_itm().Name_str(), (int)itm.Val()); // double for scribunto + rv[i] = Keyval_.new_(itm.Duration_itm().Name_str(), (int)itm.Val()); // double for scribunto } return rv; } diff --git a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_he.java b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_he.java index 7b560a61b..3074f24b5 100644 --- a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_he.java +++ b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_he.java @@ -26,11 +26,9 @@ public class Xol_grammar_he implements Xol_grammar { && !Bry_.Match(word, 0, 4, Bry__waw__1) // "וו" ) word = Bry_.Add(Bry__waw__0, word); - // Remove the "He" article if prefixed if ( Bry_.Match(word, 0, 2, Bry__he__0)) // "ה" word = Bry_.Mid(word, 2); - // Add a hyphen (maqaf) before non-Hebrew letters. if ( Bry_.Match(word, 0, 2, Bry__maqaf__0) // "א" || Bry_.Compare(word, 0, 2, Bry__maqaf__1, 0, 2) == CompareAble_.More // "ת" diff --git a/400_xowa/src/gplx/xowa/langs/kwds/Xol_kwd_grp_.java b/400_xowa/src/gplx/xowa/langs/kwds/Xol_kwd_grp_.java index 7d96d0565..ef5865421 100644 --- a/400_xowa/src/gplx/xowa/langs/kwds/Xol_kwd_grp_.java +++ b/400_xowa/src/gplx/xowa/langs/kwds/Xol_kwd_grp_.java @@ -231,8 +231,9 @@ public static final int , Id_rev_revisionsize = 209 , Id_pagebanner = 210 , Id_rev_protectionexpiry = 211 +, Id_new_window_link = 212 ; -public static final int Id__max = 212; +public static final int Id__max = 213; private static byte[] ary_itm_(int id) { switch (id) { @@ -448,6 +449,7 @@ case Xol_kwd_grp_.Id_pagesincategory_files: return Bry_.new_u8("pagesincategory_ case Xol_kwd_grp_.Id_rev_revisionsize: return Bry_.new_u8("revisionsize"); case Xol_kwd_grp_.Id_pagebanner: return Bry_.new_u8("pagebanner"); case Xol_kwd_grp_.Id_rev_protectionexpiry: return Bry_.new_u8("protectionexpiry"); +case Xol_kwd_grp_.Id_new_window_link: return Bry_.new_u8("newwindowlink"); default: throw Err_.new_unhandled(id); } } diff --git a/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr.java b/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr.java index 48baf145c..bf5cc64b9 100644 --- a/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr.java @@ -51,7 +51,7 @@ public class Xol_lnki_trail_mgr implements GfoInvkAble { private void Add_many(GfoMsg m) { int len = m.Args_count(); for (int i = 0; i < len; i++) { - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); Add(kv.Val_to_str_or_empty()); } } diff --git a/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr_tst.java b/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr_tst.java index fbec84b8c..1355fd616 100644 --- a/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/lnki_trails/Xol_lnki_trail_mgr_tst.java @@ -26,7 +26,7 @@ public class Xol_lnki_trail_mgr_tst { class Xol_lnki_trail_mgr_fxt { Xol_lang_itm lang; Xol_lnki_trail_mgr lnki_trail_mgr; public void Clear() { - Xoae_app app = Xoa_app_fxt.app_(); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("fr")); lnki_trail_mgr = lang.Lnki_trail_mgr(); } diff --git a/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_tst.java b/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_tst.java index 65fea6791..77fe077f5 100644 --- a/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_tst.java @@ -34,8 +34,8 @@ public class Xol_msg_mgr_tst { class Xol_msg_mgr_fxt { public Xol_msg_mgr_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); mgr = wiki.Msg_mgr(); } mgr.Clear(); diff --git a/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java b/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java index dc0b7e7bd..3545742a6 100644 --- a/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java @@ -24,15 +24,15 @@ public class Xol_transform_mgr implements GfoInvkAble { private boolean empty = true; public void Clear() {hash.Clear(); trie_k_to_v.Clear(); trie_v_to_k.Clear(); empty = true;} public int Len() {return hash.Count();} - public KeyVal Get_at(int i) {return (KeyVal)hash.Get_at(i);} + public Keyval Get_at(int i) {return (Keyval)hash.Get_at(i);} public byte[] Get_val_or_self(byte[] k) { // NOTE: return self; note that MW defaults "." and "," to self, even though MessagesLa.php only specifies ","; i.e.: always return something for "."; DATE:2014-05-13 - KeyVal kv = (KeyVal)hash.Get_by(k); + Keyval kv = (Keyval)hash.Get_by(k); return kv == null ? k : (byte[])kv.Val(); } public Xol_transform_mgr Set(byte[] k, byte[] v) { trie_k_to_v.Add(k, v); trie_v_to_k.Add(v, k); - KeyVal kv = KeyVal_.new_(String_.new_u8(k), v); + Keyval kv = Keyval_.new_(String_.new_u8(k), v); hash.Del(k); hash.Add(k, kv); empty = false; diff --git a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java index 58786d0eb..8309bd1e7 100644 --- a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java +++ b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java @@ -163,7 +163,7 @@ public class Xol_lang_srl { bldr.Add_indent(1).Add_proc_init_one(Xol_num_mgr.Invk_separators).Add_curly_bgn_nl(); // separators { bldr.Add_indent(2).Add_proc_init_one(Xol_num_mgr.Invk_clear).Add_term_nl(); // clear; for (int i = 0; i < separators_len; i++) { - KeyVal kv = separators_mgr.Get_at(i); + Keyval kv = separators_mgr.Get_at(i); String k = kv.Key(), v = kv.Val_to_str_or_empty(); bldr.Add_indent(2).Add_proc_init_many(Xol_transform_mgr.Invk_set).Add_parens_str_many(k, v).Add_term_nl(); // set('k', 'v'); } @@ -173,7 +173,7 @@ public class Xol_lang_srl { bldr.Add_indent(1).Add_proc_init_one(Xol_num_mgr.Invk_digits).Add_curly_bgn_nl(); // digits { bldr.Add_indent(2).Add_proc_init_one(Xol_num_mgr.Invk_clear).Add_term_nl(); // clear; for (int i = 0; i < digits_len; i++) { - KeyVal kv = digits_mgr.Get_at(i); + Keyval kv = digits_mgr.Get_at(i); String k = kv.Key(), v = kv.Val_to_str_or_empty(); bldr.Add_indent(2).Add_proc_init_many(Xol_transform_mgr.Invk_set).Add_parens_str_many(k, v).Add_term_nl(); // set('k', 'v'); } diff --git a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl_tst.java b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl_tst.java index 1b74aecec..6b69c8ae1 100644 --- a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl_tst.java +++ b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl_tst.java @@ -202,7 +202,7 @@ public class Xol_lang_srl_tst { } class Xol_lang_srl_fxt { public void Clear() { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("fr")); Xoa_gfs_mgr.Msg_parser_init(); // required by fallback_load } GfsCtx ctx = GfsCtx.new_(); Xoa_gfs_bldr bldr = new Xoa_gfs_bldr(); //Bry_bfr tmp_bfr = Bry_bfr.reset_(255); diff --git a/400_xowa/src/gplx/xowa/langs/vnts/converts/Xol_convert_regy_tst.java b/400_xowa/src/gplx/xowa/langs/vnts/converts/Xol_convert_regy_tst.java index 3f8b931b8..35b8312af 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/converts/Xol_convert_regy_tst.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/converts/Xol_convert_regy_tst.java @@ -46,20 +46,20 @@ class Xol_convert_regy_fxt { public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public Xop_fxt Parser_fxt() {return parser_fxt;} private Xop_fxt parser_fxt; public void Clear() { - app = Xoa_app_fxt.app_(); + app = Xoa_app_fxt.Make__app__edit(); Xol_lang_itm lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7("zh")); Xol_lang_itm_.Lang_init(lang); - Init_cnv(app, "zh", "zh-hant", KeyVal_.new_("x0", "x1")); - wiki = Xoa_app_fxt.wiki_(app, "zh.wikipedia.org", lang); + Init_cnv(app, "zh", "zh-hant", Keyval_.new_("x0", "x1")); + wiki = Xoa_app_fxt.Make__wiki__edit(app, "zh.wikipedia.org", lang); gplx.xowa.langs.vnts.Xol_vnt_regy_fxt.Init__vnt_mgr(wiki.Lang().Vnt_mgr(), 1, String_.Ary("zh", "zh-hans", "zh-hant")); parser_fxt = new Xop_fxt(app, wiki); } - public static void Init_cnv(Xoae_app app, String lang_key, String vnt_key, KeyVal... ary) { + public static void Init_cnv(Xoae_app app, String lang_key, String vnt_key, Keyval... ary) { Xol_lang_itm lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7(lang_key)); Xol_convert_grp grp = lang.Vnt_mgr().Convert_mgr().Converter_regy().Get_or_make(Bry_.new_a7(vnt_key)); int ary_len = ary.length; for (int i = 0; i < ary_len; i++) { - KeyVal itm = ary[i]; + Keyval itm = ary[i]; grp.Add(Bry_.new_u8(itm.Key()), Bry_.new_u8(itm.Val_to_str_or_empty())); } Xol_vnt_itm vnt_itm = lang.Vnt_mgr().Regy__get_or_new(Bry_.new_a7(vnt_key)); diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java index 640f3dba8..3b5af5655 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java @@ -164,7 +164,7 @@ public class Xop_ctx { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn xnde_tkn = (Xop_xnde_tkn)tkn; switch (xnde_tkn.Tag().Id()) { - case Xop_xnde_tag_.Tid_table: + case Xop_xnde_tag_.Tid__table: return (Xop_tblw_tkn)tkn; } break; @@ -185,11 +185,11 @@ public class Xop_ctx { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn xnde_tkn = (Xop_xnde_tkn)tkn; switch (xnde_tkn.Tag().Id()) { - case Xop_xnde_tag_.Tid_table: - case Xop_xnde_tag_.Tid_tr: - case Xop_xnde_tag_.Tid_td: - case Xop_xnde_tag_.Tid_th: - case Xop_xnde_tag_.Tid_caption: + case Xop_xnde_tag_.Tid__table: + case Xop_xnde_tag_.Tid__tr: + case Xop_xnde_tag_.Tid__td: + case Xop_xnde_tag_.Tid__th: + case Xop_xnde_tag_.Tid__caption: return (Xop_tblw_tkn)tkn; } break; diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java index ec064d81e..043fccff2 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java @@ -65,7 +65,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ tmpl_props.OnlyInclude_exists = false; int subs_len = root.Subs_len(); for (int i = 0; i < subs_len; i++) root.Subs_get(i).Tmpl_compile(ctx, src, tmpl_props); - boolean only_include_chk = Bry_find_.Find_fwd(src, Xop_xnde_tag_.Name_onlyinclude, 0, src.length) != Bry_find_.Not_found; + boolean only_include_chk = Bry_find_.Find_fwd(src, Xop_xnde_tag_.Bry__onlyinclude, 0, src.length) != Bry_find_.Not_found; if (only_include_chk) tmpl_props.OnlyInclude_exists = true; tmpl.Init_by_new(ns, name, src, root, tmpl_props.OnlyInclude_exists); } private Xot_compile_data tmpl_props = new Xot_compile_data(); diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java index 68a9a1a85..d45fc7ce0 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java @@ -62,33 +62,37 @@ public class Xop_tkn_mkr { public Xop_bry_tkn Bry_raw(int bgn, int end, byte[] bry) {return new Xop_bry_tkn(bgn, end, bry);} public Xop_bry_tkn Bry_mid(byte[] src, int bgn, int end) {return new Xop_bry_tkn(bgn, end, Bry_.Mid(src, bgn, end));} public Xop_under_tkn Under(int bgn, int end, int v) {return new Xop_under_tkn(bgn, end, v);} - public gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd Xnde_xowa_cmd() {return new gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd();} - public gplx.xowa.xtns.poems.Poem_nde Xnde_poem() {return new gplx.xowa.xtns.poems.Poem_nde();} - public Ref_nde Xnde_ref() {return new Ref_nde();} - public References_nde Xnde_references() {return new References_nde();} - public gplx.xowa.xtns.math.Math_nde Xnde_math() {return new gplx.xowa.xtns.math.Math_nde();} - public gplx.xowa.xtns.gallery.Gallery_xnde Xnde_gallery() {return new gplx.xowa.xtns.gallery.Gallery_xnde();} - public gplx.xowa.xtns.imaps.Imap_xnde Xnde_imageMap() {return new gplx.xowa.xtns.imaps.Imap_xnde();} - public gplx.xowa.xtns.hieros.Hiero_xnde Xnde_hiero() {return new gplx.xowa.xtns.hieros.Hiero_xnde();} - public gplx.xowa.xtns.graphs.Graph_xnde Xnde_graph() {return new gplx.xowa.xtns.graphs.Graph_xnde();} - public gplx.xowa.xtns.proofreadPage.Pp_pages_nde Xnde_pages() {return new gplx.xowa.xtns.proofreadPage.Pp_pages_nde();} - public gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde Xnde_pagelist() {return new gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde();} - public gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde Xnde_pagequality() {return new gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde();} - public gplx.xowa.xtns.lst.Lst_section_nde Xnde_section() {return new gplx.xowa.xtns.lst.Lst_section_nde();} - public gplx.xowa.xtns.categoryList.Xtn_categorylist_nde Xnde_categoryList() {return new gplx.xowa.xtns.categoryList.Xtn_categorylist_nde();} - public gplx.xowa.xtns.dynamicPageList.Dpl_xnde Xnde_dynamicPageList() {return new gplx.xowa.xtns.dynamicPageList.Dpl_xnde();} - public gplx.xowa.xtns.syntax_highlights.Synh_xtn_nde Xnde_syntaxHighlight() {return new gplx.xowa.xtns.syntax_highlights.Synh_xtn_nde();} - public gplx.xowa.xtns.templateData.Xtn_templateData_nde Xnde_templateData() {return new gplx.xowa.xtns.templateData.Xtn_templateData_nde();} - public gplx.xowa.xtns.rss.Rss_xnde Xnde_rss() {return new gplx.xowa.xtns.rss.Rss_xnde();} - public gplx.xowa.xtns.quiz.Quiz_xnde Xnde_quiz() {return new gplx.xowa.xtns.quiz.Quiz_xnde();} - public gplx.xowa.xtns.indicators.Indicator_xnde Xnde_indicator() {return new gplx.xowa.xtns.indicators.Indicator_xnde();} - public gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd Xnde_xowa_html() {return new gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd();} - public gplx.xowa.xtns.listings.Listing_xnde Xnde_listing(int tag_id) {return new gplx.xowa.xtns.listings.Listing_xnde(tag_id);} - public gplx.xowa.xtns.scores.Score_xnde Xnde_score() {return new gplx.xowa.xtns.scores.Score_xnde();} - public gplx.xowa.xtns.inputBox.Xtn_inputbox_nde Xnde_inputbox() {return new gplx.xowa.xtns.inputBox.Xtn_inputbox_nde();} - public gplx.xowa.xtns.translates.Xop_translate_xnde Xnde_translate() {return new gplx.xowa.xtns.translates.Xop_translate_xnde();} - public gplx.xowa.xtns.translates.Xop_languages_xnde Xnde_languages() {return new gplx.xowa.xtns.translates.Xop_languages_xnde();} - public gplx.xowa.xtns.translates.Xop_tvar_tkn Tvar(int tkn_bgn, int tkn_end, int key_bgn, int key_end, int txt_bgn, int txt_end, byte[] wikitext) {return new gplx.xowa.xtns.translates.Xop_tvar_tkn(tkn_bgn, tkn_end, key_bgn, key_end, txt_bgn, txt_end, wikitext);} + public gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd Xnde__xowa_cmd() {return new gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd();} + public gplx.xowa.xtns.poems.Poem_nde Xnde__poem() {return new gplx.xowa.xtns.poems.Poem_nde();} + public Ref_nde Xnde__ref() {return new Ref_nde();} + public References_nde Xnde__references() {return new References_nde();} + public gplx.xowa.xtns.math.Math_nde Xnde__math() {return new gplx.xowa.xtns.math.Math_nde();} + public gplx.xowa.xtns.gallery.Gallery_xnde Xnde__gallery() {return new gplx.xowa.xtns.gallery.Gallery_xnde();} + public gplx.xowa.xtns.imaps.Imap_xnde Xnde__imageMap() {return new gplx.xowa.xtns.imaps.Imap_xnde();} + public gplx.xowa.xtns.hieros.Hiero_xnde Xnde__hiero() {return new gplx.xowa.xtns.hieros.Hiero_xnde();} + public gplx.xowa.xtns.graphs.Graph_xnde Xnde__graph() {return new gplx.xowa.xtns.graphs.Graph_xnde();} + public gplx.xowa.xtns.proofreadPage.Pp_pages_nde Xnde__pages() {return new gplx.xowa.xtns.proofreadPage.Pp_pages_nde();} + public gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde Xnde__pagelist() {return new gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde();} + public gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde Xnde__pagequality() {return new gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde();} + public gplx.xowa.xtns.lst.Lst_section_nde Xnde__section() {return new gplx.xowa.xtns.lst.Lst_section_nde();} + public gplx.xowa.xtns.categoryList.Xtn_categorylist_nde Xnde__categoryList() {return new gplx.xowa.xtns.categoryList.Xtn_categorylist_nde();} + public gplx.xowa.xtns.dynamicPageList.Dpl_xnde Xnde__dynamicPageList() {return new gplx.xowa.xtns.dynamicPageList.Dpl_xnde();} + public gplx.xowa.xtns.syntax_highlights.Synh_xtn_nde Xnde__syntaxHighlight() {return new gplx.xowa.xtns.syntax_highlights.Synh_xtn_nde();} + public gplx.xowa.xtns.templateData.Xtn_templateData_nde Xnde__templateData() {return new gplx.xowa.xtns.templateData.Xtn_templateData_nde();} + public gplx.xowa.xtns.rss.Rss_xnde Xnde__rss() {return new gplx.xowa.xtns.rss.Rss_xnde();} + public gplx.xowa.xtns.quiz.Quiz_xnde Xnde__quiz() {return new gplx.xowa.xtns.quiz.Quiz_xnde();} + public gplx.xowa.xtns.indicators.Indicator_xnde Xnde__indicator() {return new gplx.xowa.xtns.indicators.Indicator_xnde();} + public gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd Xnde__xowa_html() {return new gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd();} + public gplx.xowa.xtns.listings.Listing_xnde Xnde__listing(int tag_id) {return new gplx.xowa.xtns.listings.Listing_xnde(tag_id);} + public gplx.xowa.xtns.scores.Score_xnde Xnde__score() {return new gplx.xowa.xtns.scores.Score_xnde();} + public gplx.xowa.xtns.inputBox.Xtn_inputbox_nde Xnde__inputbox() {return new gplx.xowa.xtns.inputBox.Xtn_inputbox_nde();} + public gplx.xowa.xtns.translates.Xop_translate_xnde Xnde__translate() {return new gplx.xowa.xtns.translates.Xop_translate_xnde();} + public gplx.xowa.xtns.translates.Xop_languages_xnde Xnde__languages() {return new gplx.xowa.xtns.translates.Xop_languages_xnde();} + public gplx.xowa.xtns.wikias.Random_selection_xnde Xnde__random_selection() {return new gplx.xowa.xtns.wikias.Random_selection_xnde();} + public gplx.xowa.xtns.wikias.Tabber_xnde Xnde__tabber() {return new gplx.xowa.xtns.wikias.Tabber_xnde();} + public gplx.xowa.xtns.wikias.Tabview_xnde Xnde__tabview() {return new gplx.xowa.xtns.wikias.Tabview_xnde();} + + public gplx.xowa.xtns.translates.Xop_tvar_tkn Tvar(int tkn_bgn, int tkn_end, int key_bgn, int key_end, int txt_bgn, int txt_end, byte[] wikitext) {return new gplx.xowa.xtns.translates.Xop_tvar_tkn(tkn_bgn, tkn_end, key_bgn, key_end, txt_bgn, txt_end, wikitext);} // public void Clear() { // space_tkns_len = txt_tkns_len = 0; // } diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java index 6347da269..a32e292af 100644 --- a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java @@ -34,7 +34,7 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr { if (bgn_pos == Xop_parser_.Doc_bgn_bos) bgn_pos = 0; // do not allow -1 pos ctx.Apos().EndFrame(ctx, root, src, bgn_pos, false); Close_open_itms(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos); - ctx.Para().Process_block__bgn__nl_w_symbol(ctx, root, src, bgn_pos, cur_pos, Xop_xnde_tag_.Tag_h2); // pass h2; should pass h# where # is correct #, but for purpose of Para_wkr,

tag does not matter + ctx.Para().Process_block__bgn__nl_w_symbol(ctx, root, src, bgn_pos, cur_pos, Xop_xnde_tag_.Tag__h2); // pass h2; should pass h# where # is correct #, but for purpose of Para_wkr,

tag does not matter int new_pos = Bry_find_.Find_fwd_while(src, cur_pos, src_len, Xop_hdr_lxr.Hook); // count all = int hdr_len = new_pos - cur_pos + 1; // +1 b/c Hook has 1 eq: "\n=" switch (hdr_len) { @@ -73,7 +73,7 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr { if (dirty) hdr.Hdr_bgn_manual_(bgn_manual).Hdr_end_manual_(end_manual).Hdr_level_(hdr_len); cur_pos = Find_fwd_while_ws_hdr_version(src, cur_pos, src_len); // NOTE: hdr gobbles up trailing ws; EX: "==a== \n\t \n \nb" gobbles up all 3 "\n"s; otherwise para_wkr will process
- ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_h2); + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__h2); hdr.Subs_move(root); hdr.Src_end_(cur_pos); if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) diff --git a/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_atr_parser.java b/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_atr_parser.java index 71259637c..64febb263 100644 --- a/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_atr_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_atr_parser.java @@ -472,10 +472,10 @@ public class Mwh_atr_parser { // REF.MW:Sanitizer.php|decodeTagAttributes;MW_ATT return Bry_find_.Not_found; } private static final Hash_adp_bry xnde_hash = Hash_adp_bry.ci_a7() - .Add_bry_bry(Xop_xnde_tag_.Tag_nowiki.Name_bry()) - .Add_bry_bry(Xop_xnde_tag_.Tag_noinclude.Name_bry()) - .Add_bry_bry(Xop_xnde_tag_.Tag_includeonly.Name_bry()) - .Add_bry_bry(Xop_xnde_tag_.Tag_onlyinclude.Name_bry()) + .Add_bry_bry(Xop_xnde_tag_.Tag__nowiki.Name_bry()) + .Add_bry_bry(Xop_xnde_tag_.Tag__noinclude.Name_bry()) + .Add_bry_bry(Xop_xnde_tag_.Tag__includeonly.Name_bry()) + .Add_bry_bry(Xop_xnde_tag_.Tag__onlyinclude.Name_bry()) ; public static final int Key_tid__unknown = -1; } diff --git a/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_doc_parser_tst.java b/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_doc_parser_tst.java index 89bf4322c..84122adcd 100644 --- a/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_doc_parser_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/htmls/Mwh_doc_parser_tst.java @@ -41,9 +41,9 @@ public class Mwh_doc_parser_tst { @Test public void Node__single_only() { fxt.Test_parse("a
b
c" , fxt.Make_nde_head("") - , fxt.Make_txt("a", Xop_xnde_tag_.Tid_b) + , fxt.Make_txt("a", Xop_xnde_tag_.Tid__b) , fxt.Make_nde_head("
") - , fxt.Make_txt("b", Xop_xnde_tag_.Tid_b) // not
+ , fxt.Make_txt("b", Xop_xnde_tag_.Tid__b) // not
, fxt.Make_nde_tail("
") , fxt.Make_txt("c", Xop_xnde_tag_.Tid__null) ); @@ -51,9 +51,9 @@ public class Mwh_doc_parser_tst { @Test public void Node__pre() { fxt.Test_parse("
a
b
c" , fxt.Make_nde_head("
")
-		, fxt.Make_txt("a", Xop_xnde_tag_.Tid_pre)
+		, fxt.Make_txt("a", Xop_xnde_tag_.Tid__pre)
 		, fxt.Make_nde_head("
") - , fxt.Make_txt("b", Xop_xnde_tag_.Tid_pre) //
 not 
+ , fxt.Make_txt("b", Xop_xnde_tag_.Tid__pre) //
 not 
, fxt.Make_nde_tail("
") , fxt.Make_txt("c", Xop_xnde_tag_.Tid__null) ); diff --git a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java index ae54f77e6..3ff3e4eb0 100644 --- a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java @@ -30,7 +30,7 @@ public class Xop_list_wkr implements Xop_ctx_wkr { // NOTE: list_tkns can not be explicitly closed, so auto-close will happen for all items MakeTkn_end(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, (Xop_list_tkn)tkn, Bool_.Y_byte); Reset(listId + 1); - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_ul); + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__ul); } public int MakeTkn_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {// REF.MW: Parser|doBlockLevels if (bgn_pos == Xop_parser_.Doc_bgn_bos) bgn_pos = 0; // do not allow -1 pos @@ -47,7 +47,7 @@ public class Xop_list_wkr implements Xop_ctx_wkr { symByt = src[cur_pos - 1]; // NOTE: get symByt again b/c cur_pos may have changed; EX: "#*"; # may have triggered list, but last symByt should be * if (SymAry_fill_overflow) return ctx.Lxr_make_txt_(cur_pos); PrvItm_compare(); - ctx.Para().Process_block__bgn__nl_w_symbol(ctx, root, src, bgn_pos, cur_pos - 1, Xop_xnde_tag_.Tag_li); // -1 b/c cur_pos includes sym_byte; EX: \n*; pass li; should pass correct tag, but for purposes of para_wkr,
  • doesn't matter + ctx.Para().Process_block__bgn__nl_w_symbol(ctx, root, src, bgn_pos, cur_pos - 1, Xop_xnde_tag_.Tag__li); // -1 b/c cur_pos includes sym_byte; EX: \n*; pass li; should pass correct tag, but for purposes of para_wkr,
  • doesn't matter if (prvSymMatch) { PopTil(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, Bool_.N_byte); posBldr.MoveNext(); @@ -101,7 +101,7 @@ public class Xop_list_wkr implements Xop_ctx_wkr { Xop_tkn_itm end_tkn = tkn_mkr.List_end(bgn_pos, bgn.List_itmTyp()).List_path_(bgn.List_path()).List_uid_(listId).List_sub_last_(sub_last); ctx.Subs_add(root, end_tkn); // if (empty_ignored) ctx.Empty_ignore(root, bgn.Tkn_sub_idx()); // commented; code was incorrectly deactivating "*a" when "
  • " encountered; PAGE:en.w:Bristol_Bullfinch DATE:2014-06-24 - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_ul); + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__ul); } private Xop_list_tkn PopTil(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, byte subLast) { int acs_pos = ctx.Stack_idx_find_but_stop_at_tbl(Xop_tkn_itm_.Tid_list); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_dangling_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_dangling_tst.java index 61c61d9fe..5d4a573a4 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_dangling_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_dangling_tst.java @@ -36,4 +36,4 @@ public class Xop_lnke_wkr_dangling_tst { @Test public void Dangling_gt() { fxt.Test_parse_page_wiki("[irc://a>b c]", fxt.tkn_lnke_(0, 13).Lnke_typ_(Xop_lnke_tkn.Lnke_typ_brack).Subs_(fxt.tkn_txt_(8, 10), fxt.tkn_space_(10, 11), fxt.tkn_txt_(11, 12))); } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_link_parser.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_link_parser.java index a5d239262..377ec8ced 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_link_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_link_parser.java @@ -30,7 +30,7 @@ public class Xop_link_parser { switch (tmp_url.Protocol_tid()) { case Gfo_protocol_itm.Tid_http: case Gfo_protocol_itm.Tid_https: // "http:" or "https:"; check if to offline wiki and redirect byte[] wiki_bry = tmp_url.Wiki_bry(), page_bry = tmp_url.Page_bry(); - if ( !tmp_url.Wiki_is_missing() // https://www.a.org and others will be marked "missing" by Xoa_url_parser + if ( !tmp_url.Wiki_is_missing() // https://www.a.org and others will be marked "missing" by Xow_url_parser &&( Bry_.Eq(wiki_bry, wiki.Domain_bry()) // link is to this wiki; check if alias || app.Xwiki_mgr__exists(wiki_bry) // link is to an xwiki ) diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_arg_parser.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_arg_parser.java index 0a3c60938..6f8f5b004 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_arg_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_arg_parser.java @@ -129,7 +129,7 @@ public class Xop_lnki_arg_parser { size_trie.Add((byte)(i + Byte_ascii.Num_0), Byte_obj_val.new_(Key_dim_num)); int len = digit_mgr.Len(); // NOTE: add non-english numbers; EX: ۲۰۰px; DATE:2015-07-18 for (int i = 0; i < len; ++i) { - KeyVal kv = digit_mgr.Get_at(i); + Keyval kv = digit_mgr.Get_at(i); int num = (byte)Int_.parse_or(kv.Key(), -1); if (num == -1) continue; // ignore separators; EX: "," "." size_trie.Add((byte[])kv.Val(), Byte_obj_val.new_((byte)num)); // NOTE: num corresponds to dim_d0 -> d9 below } @@ -144,7 +144,7 @@ public class Xop_lnki_arg_parser { px_trie.Add(word_bry, Byte_obj_val.new_(Tid_dim)); } } - public static final byte[] Bry_upright = Bry_.new_a7("upright"), Bry_thumbtime = Bry_.new_a7("thumbtime"); + public static final byte[] Bry_upright = Bry_.new_a7("upright"), Bry_thumbtime = Bry_.new_a7("thumbtime"), Bry_target = Bry_.new_a7("target"); public static final byte Tid_unknown = 0, Tid_thumb = 1, Tid_left = 2, Tid_right = 3, Tid_none = 4, Tid_center = 5, Tid_frame = 6, Tid_frameless = 7, Tid_upright = 8, Tid_border = 9 , Tid_alt = 10, Tid_link = 11, Tid_baseline = 12, Tid_sub = 13, Tid_super = 14, Tid_top = 15, Tid_text_top = 16, Tid_middle = 17, Tid_bottom = 18, Tid_text_bottom = 19 @@ -153,6 +153,7 @@ public class Xop_lnki_arg_parser { , Tid_page = 23 , Tid_noplayer = 24, Tid_noicon = 25, Tid_thumbtime = 26 , Tid_class = 27 + , Tid_target = 28 ; private static final byte[] X_bry = Bry_.new_a7("x"); private static final byte // NOTE: d0 - d9 must match 0 - 9; DATE:2015-07-18 diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_tkn.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_tkn.java index bab781544..405d23f7f 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_tkn.java @@ -51,9 +51,10 @@ public class Xop_lnki_tkn extends Xop_tkn_itm_base { public boolean Pipe_count_is_zero() {return pipe_count++ == 0;} public boolean Xtn_sites_link() {return xtn_sites_link;} public void Xtn_sites_link_(boolean v) {xtn_sites_link = v;} private boolean xtn_sites_link; public Xoh_file_img_wkr Lnki_file_wkr() {return lnki_file_wkr;} public void Lnki_file_wkr_(Xoh_file_img_wkr v) {lnki_file_wkr = v;} private Xoh_file_img_wkr lnki_file_wkr; + public byte[] Target; public byte[] Ttl_ary() { return ttl.ForceLiteralLink() || ns_id != Xow_ns_.Tid__main // if [[:]] or non-main (Category, Template) - ? ttl.Full_txt() // use full_txt (no initial colon; capitalize first) + ? ttl.Full_txt_w_ttl_case() // use full_txt (no initial colon; capitalize first) : ttl.Raw(); // use raw (preserve case, white-spaces) } public boolean Caption_exists() { diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java index 6ea7369f4..02caf3a6a 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java @@ -98,6 +98,10 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { int bgn = arg.Val_tkn().Dat_bgn(), end = arg.Val_tkn().Dat_end(); if (arg.KeyTkn_exists()) {bgn = arg.Key_tkn().Dat_bgn(); end = arg.Key_tkn().Dat_end();} arg_tid = ctx.Wiki().Lang().Lnki_arg_parser().Identify_tid(src, bgn, end, lnki); + if (arg_tid == Xop_lnki_arg_parser.Tid_caption && ctx.Wiki().Domain_itm().Domain_type_id() == gplx.xowa.wikis.domains.Xow_domain_tid_.Int__other) { + if (end > bgn && Bry_.Eq(src, bgn, end, Xop_lnki_arg_parser.Bry_target)) + arg_tid = Xop_lnki_arg_parser.Tid_target; + } switch (arg_tid) { case Xop_lnki_arg_parser.Tid_none: lnki.Align_h_(Xop_lnki_type.Id_none); break; case Xop_lnki_arg_parser.Tid_border: lnki.Border_(Bool_.Y_byte); break; @@ -116,6 +120,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { case Xop_lnki_arg_parser.Tid_text_bottom: lnki.Align_v_(Xop_lnki_align_v_.TextBottom); break; case Xop_lnki_arg_parser.Tid_baseline: lnki.Align_v_(Xop_lnki_align_v_.Baseline); break; case Xop_lnki_arg_parser.Tid_class: lnki.Lnki_cls_(Xop_lnki_wkr_.Val_extract(src, arg)); break; + case Xop_lnki_arg_parser.Tid_target: lnki.Target = Xop_lnki_wkr_.Val_extract(src, arg); break; case Xop_lnki_arg_parser.Tid_alt: lnki.Alt_tkn_(arg); lnki.Alt_tkn().Tkn_ini_pos(false, arg.Src_bgn(), arg.Src_end()); break; diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__xwiki_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__xwiki_tst.java index cb3b6012b..a4764a90d 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__xwiki_tst.java @@ -66,8 +66,8 @@ public class Xop_lnki_wkr__xwiki_tst { Tfds.Eq(0, fxt.Page().Slink_list().Count()); } @Test public void Simple_and_english() { // PURPOSE: s.w xwiki links to en were not working b/c s.w and en had same super lang of English; PAGE:s.q:Anonymous DATE:2014-09-10 - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "simple.wikipedia.org"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "simple.wikipedia.org"); fxt = new Xop_fxt(app, wiki); // change fxt to simple.wikipedia.org Reg_xwiki_alias("en", "en.wikipedia.org"); // register "en" alias fxt.Test_parse_page_wiki_str // test nothing printed @@ -77,8 +77,8 @@ public class Xop_lnki_wkr__xwiki_tst { Tfds.Eq(1, fxt.Page().Slink_list().Count()); // test 1 xwiki lang } @Test public void Species_and_commons() { // PURPOSE: species xwiki links to commons should not put link in wikidata langs; PAGE:species:Scarabaeidae DATE:2014-09-10 - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "species.wikimedia.org"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "species.wikimedia.org"); fxt = new Xop_fxt(app, wiki); // change fxt to species.wikimedia.org Reg_xwiki_alias("commons", "commons.wikimedia.org"); // register "en" alias fxt.Test_parse_page_wiki_str // test something printed @@ -88,8 +88,8 @@ public class Xop_lnki_wkr__xwiki_tst { Tfds.Eq(0, fxt.Page().Slink_list().Count()); // no xwiki langs } @Test public void Wiktionary_and_wikipedia() { // PURPOSE: do not create xwiki links if same lang and differet type; PAGE:s.d:water DATE:2014-09-14 - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "simple.wiktionary.org"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "simple.wiktionary.org"); fxt = new Xop_fxt(app, wiki); // change fxt to simple.wiktionary.org Reg_xwiki_alias("w", "simple.wikipedia.org"); // register "w" alias fxt.Test_parse_page_wiki_str // test something printed @@ -99,8 +99,8 @@ public class Xop_lnki_wkr__xwiki_tst { Tfds.Eq(0, fxt.Page().Slink_list().Count()); // test 0 xwiki lang } @Test public void Species_and_wikipedia() { // PURPOSE: species creates xwiki links to wikipedia; PAGE:species:Puccinia DATE:2014-09-14 - Xoae_app app = Xoa_app_fxt.app_(); - Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "species.wikimedia.org"); + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "species.wikimedia.org"); fxt = new Xop_fxt(app, wiki); // change fxt to species.wikimedia.org Reg_xwiki_alias("fr", "fr.wikipedia.org"); // register "fr" alias fxt.Test_parse_page_wiki_str // nothing printed diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java index d240d45e8..6ea10e18f 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java @@ -33,7 +33,7 @@ public class Xop_log_mgr implements GfoInvkAble { private Db_conn Conn() { if (conn == null) { if (log_dir == null) log_dir = app.Usere().Fsys_mgr().App_temp_dir(); - Xob_db_file db_file = Xob_db_file.new__temp_log(log_dir); + Xob_db_file db_file = Xob_db_file.New__temp_log(log_dir); conn = db_file.Conn(); } return conn; diff --git a/400_xowa/src/gplx/xowa/parsers/miscs/Xop_hr_lxr.java b/400_xowa/src/gplx/xowa/parsers/miscs/Xop_hr_lxr.java index edf850b77..6aa13fbc2 100644 --- a/400_xowa/src/gplx/xowa/parsers/miscs/Xop_hr_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/miscs/Xop_hr_lxr.java @@ -35,10 +35,10 @@ public class Xop_hr_lxr implements Xop_lxr { cur_pos = Bry_find_.Find_fwd_while(src, cur_pos, src_len, Hook_byt); // gobble consecutive dashes if (!bos) ctx.Para().Process_nl(ctx, root, src, bgn_pos, bgn_pos); // simulate \n in front of ---- - ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag_hr); // para=n; block=y + ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag__hr); // para=n; block=y int hr_len = cur_pos - bgn_pos + nl_adj; // TODO: syntax_check if > 4 ctx.Subs_add(root, tkn_mkr.Hr(bgn_pos, cur_pos, hr_len)); - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_hr); // block=n; para=y; + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__hr); // block=n; para=y; return cur_pos; } private static final byte Hook_byt = Byte_ascii.Dash; public static final int Hr_len = 4; diff --git a/400_xowa/src/gplx/xowa/parsers/paras/Xop_nl_lxr.java b/400_xowa/src/gplx/xowa/parsers/paras/Xop_nl_lxr.java index e31b67df1..1af98a340 100644 --- a/400_xowa/src/gplx/xowa/parsers/paras/Xop_nl_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/paras/Xop_nl_lxr.java @@ -59,11 +59,11 @@ public class Xop_nl_lxr implements Xop_lxr { case Xop_tkn_itm_.Tid_hdr: // last tkn was hdr; close it; EX: \n==a==\nb; "\n" should close 2nd "=="; DATE:2014-02-17 int acs_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_hdr); ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_newLine); - para_wkr.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_h2); + para_wkr.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__h2); break; case Xop_tkn_itm_.Tid_list: // close list Xop_list_wkr_.Close_list_if_present(ctx, root, src, bgn_pos, cur_pos); - para_wkr.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_li); + para_wkr.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__li); break; case Xop_tkn_itm_.Tid_lnke: // close lnke if (ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_tmpl_invk) == -1) // only close if no tmpl; MWR: [[SHA-2]]; * {{cite journal|title=Proposed diff --git a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java index 96997bba4..c1d46c144 100644 --- a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java @@ -59,7 +59,7 @@ public class Xop_para_wkr implements Xop_ctx_wkr { public void Process_block_lnki_div() { // bgn_lhs is pos of [[; end_lhs is pos of ]] if (prv_ws_bgn > 0) // if pre at start of line; ignore it b/c of div; EX: "\n\s[[File:A.png|thumb]]" should not produce thumb; also [[File:A.png|right]]; DATE:2014-02-17 prv_ws_bgn = 0; - this.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_div); + this.Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__div); } private void Process_block(Xop_xnde_tag tag, boolean bgn, boolean end) { if (prv_ws_bgn > 0) { @@ -69,7 +69,7 @@ public class Xop_para_wkr implements Xop_ctx_wkr { block_is_bgn_xnde = bgn; block_is_end_xnde = end; switch (tag.Id()) { - case Xop_xnde_tag_.Tid_blockquote: + case Xop_xnde_tag_.Tid__blockquote: if (bgn) block_is_bgn_blockquote = true; if (end) block_is_end_blockquote = true; break; @@ -268,7 +268,7 @@ public class Xop_para_wkr implements Xop_ctx_wkr { } } private void Add_br(Xop_ctx ctx, Xop_root_tkn root, int bgn_pos) { - ctx.Subs_add(root, ctx.Tkn_mkr().Xnde(bgn_pos, bgn_pos).Tag_(Xop_xnde_tag_.Tag_br)); + ctx.Subs_add(root, ctx.Tkn_mkr().Xnde(bgn_pos, bgn_pos).Tag_(Xop_xnde_tag_.Tag__br)); } private boolean Line_is_ws(byte[] src, int pos) { if (prv_nl_pos == -1) return false; diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tb_tkn.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tb_tkn.java index 4399580c9..2410be013 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tb_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tb_tkn.java @@ -24,7 +24,7 @@ public class Xop_tblw_tb_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { atrs_bgn = atrs_end = bgn; } @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tb;} - public int Tblw_tid() {return Xop_xnde_tag_.Tid_table;} + public int Tblw_tid() {return Xop_xnde_tag_.Tid__table;} public int Atrs_bgn() {return atrs_bgn;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null; public int Atrs_end() {return atrs_end;} private int atrs_end = -1; public void Atrs_rng_set(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end;} diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tc_tkn.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tc_tkn.java index cef33d77f..621141395 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tc_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tc_tkn.java @@ -19,7 +19,7 @@ package gplx.xowa.parsers.tblws; import gplx.*; import gplx.xowa.*; import gplx. import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; public class Xop_tblw_tc_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tc;} - public int Tblw_tid() {return Xop_xnde_tag_.Tid_caption;} + public int Tblw_tid() {return Xop_xnde_tag_.Tid__caption;} public int Atrs_bgn() {return atrs_bgn;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null; public int Atrs_end() {return atrs_end;} private int atrs_end = -1; public void Atrs_rng_set(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end;} diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_td_tkn.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_td_tkn.java index 740f1b9b1..75b4a4414 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_td_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_td_tkn.java @@ -19,7 +19,7 @@ package gplx.xowa.parsers.tblws; import gplx.*; import gplx.xowa.*; import gplx. import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; public class Xop_tblw_td_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_td;} - public int Tblw_tid() {return Xop_xnde_tag_.Tid_td;} + public int Tblw_tid() {return Xop_xnde_tag_.Tid__td;} public int Atrs_bgn() {return atrs_bgn;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null; public int Atrs_end() {return atrs_end;} private int atrs_end = -1; public void Atrs_rng_set(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end;} diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_th_tkn.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_th_tkn.java index 66b688b97..d0aaa46e6 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_th_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_th_tkn.java @@ -19,7 +19,7 @@ package gplx.xowa.parsers.tblws; import gplx.*; import gplx.xowa.*; import gplx. import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; public class Xop_tblw_th_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_th;} - public int Tblw_tid() {return Xop_xnde_tag_.Tid_th;} + public int Tblw_tid() {return Xop_xnde_tag_.Tid__th;} public int Atrs_bgn() {return atrs_bgn;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null; public int Atrs_end() {return atrs_end;} private int atrs_end = -1; public void Atrs_rng_set(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end;} diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tr_tkn.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tr_tkn.java index ab2d5bd49..1ea5ba4ab 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tr_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_tr_tkn.java @@ -24,7 +24,7 @@ public class Xop_tblw_tr_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { atrs_bgn = atrs_end = bgn; } @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tr;} - public int Tblw_tid() {return Xop_xnde_tag_.Tid_tr;} + public int Tblw_tid() {return Xop_xnde_tag_.Tid__tr;} public int Atrs_bgn() {return atrs_bgn;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null; public int Atrs_end() {return atrs_end;} private int atrs_end = -1; public void Atrs_rng_set(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end;} diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java index ee8b98500..871663e1e 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java @@ -211,8 +211,8 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { } else { if (!tbl_is_xml) // only for "\n|" not
  • - ctx.Para().Process_nl(ctx, root, src, bgn_pos, bgn_pos + 1); // simulate "\n"; DATE:2014-02-20; ru.w:;[[Help:Download]]; DATE:2014-02-20 - ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag_td); // + ctx.Para().Process_nl(ctx, root, src, bgn_pos, bgn_pos + 1); // simulate "\n"; DATE:2014-02-20; ru.w:;home/wiki/Dashboard/Image_databases; DATE:2014-02-20 + ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag__td); // ctx.Stack_pop_til(root, src, ctx.Stack_idx_typ(prv_tid), true, bgn_pos, bgn_pos, Xop_tkn_itm_.Tid_tblw_td); } break; @@ -311,11 +311,11 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { switch (wlxr_type) { case Tblw_type_tb: case Tblw_type_tr: - ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag_tr); + ctx.Para().Process_block__bgn_y__end_n(Xop_xnde_tag_.Tag__tr); break; case Tblw_type_td: case Tblw_type_th: - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_td); + ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__td); break; } return cur_pos; @@ -383,7 +383,7 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { Xop_tblw_tb_tkn tb = (Xop_tblw_tb_tkn)ctx.Stack_pop_til(root, src, tb_idx, false, bgn_pos, bgn_pos, Xop_tkn_itm_.Tid_tblw_td); // NOTE: need to pop manually in order to set all intermediate node ends to bgn_pos, but tb ent to cur_pos; EX: for stack of "tb,tr,td" tr and td get End_() of bgn_pos but tb gets End_() of cur_pos tb.Subs_move(root); tb.Src_end_(cur_pos); - ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_table); // NOTE: must clear block state that was started by
    && !xtn_hash.Has(xnde.Name_bry()) // xtn_xnde is not in xtn_hash - && !Int_.In(xnde.Id(), Xop_xnde_tag_.Tid_translate, Xop_xnde_tag_.Tid_languages) // always include and ; TODO:filter out when extensions supported in site_cfg; DATE:2015-10-13 + && !Int_.In(xnde.Id(), Xop_xnde_tag_.Tid__translate, Xop_xnde_tag_.Tid__languages) // always include and ; TODO:filter out when extensions supported in site_cfg; DATE:2015-10-13 ; // skip; xtn is not defined in site_meta_db } private void Add_itm(Btrie_slim_mgr trie, Xop_xnde_tag xnde) { diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java index ce6f11409..90d0101db 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java @@ -45,10 +45,10 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { public Xox_xnde Xnde_xtn() {return xnde_xtn;} public Xop_xnde_tkn Xnde_xtn_(Xox_xnde v) {xnde_xtn = v; return this;} private Xox_xnde xnde_xtn; @Override public void Tmpl_compile(Xop_ctx ctx, byte[] src, Xot_compile_data prep_data) { switch (tag.Id()) { - case Xop_xnde_tag_.Tid_noinclude: // NOTE: prep_mode is false to force recompile; see Ex_Tmpl_noinclude and {{{1|a}}} - case Xop_xnde_tag_.Tid_includeonly: // NOTE: changed to always ignore ; DATE:2014-05-10 + case Xop_xnde_tag_.Tid__noinclude: // NOTE: prep_mode is false to force recompile; see Ex_Tmpl_noinclude and {{{1|a}}} + case Xop_xnde_tag_.Tid__includeonly: // NOTE: changed to always ignore ; DATE:2014-05-10 break; - case Xop_xnde_tag_.Tid_nowiki: { + case Xop_xnde_tag_.Tid__nowiki: { int subs_len = this.Subs_len(); for (int i = 0; i < subs_len; i++) { Xop_tkn_itm sub = this.Subs_get(i); @@ -56,7 +56,7 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { } break; } - case Xop_xnde_tag_.Tid_onlyinclude: { + case Xop_xnde_tag_.Tid__onlyinclude: { int subs_len = this.Subs_len(); for (int i = 0; i < subs_len; i++) { Xop_tkn_itm sub = this.Subs_get(i); @@ -84,21 +84,21 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { // } int subs_len = this.Subs_len(); switch (tag.Id()) { - case Xop_xnde_tag_.Tid_noinclude: // do not evaluate subs + case Xop_xnde_tag_.Tid__noinclude: // do not evaluate subs break; - case Xop_xnde_tag_.Tid_includeonly: // evaluate subs + case Xop_xnde_tag_.Tid__includeonly: // evaluate subs if (!ctx.Only_include_evaluate()) { for (int i = 0; i < subs_len; i++) this.Subs_get(i).Tmpl_evaluate(ctx, src, caller, bfr); } break; - case Xop_xnde_tag_.Tid_nowiki: // evaluate subs; add tags - bfr.Add_byte(Byte_ascii.Lt).Add(Xop_xnde_tag_.Tag_nowiki.Name_bry()).Add_byte(Byte_ascii.Gt); + case Xop_xnde_tag_.Tid__nowiki: // evaluate subs; add tags + bfr.Add_byte(Byte_ascii.Lt).Add(Xop_xnde_tag_.Tag__nowiki.Name_bry()).Add_byte(Byte_ascii.Gt); for (int i = 0; i < subs_len; i++) this.Subs_get(i).Tmpl_evaluate(ctx, src, caller, bfr); - bfr.Add_byte(Byte_ascii.Lt).Add_byte(Byte_ascii.Slash).Add(Xop_xnde_tag_.Tag_nowiki.Name_bry()).Add_byte(Byte_ascii.Gt); + bfr.Add_byte(Byte_ascii.Lt).Add_byte(Byte_ascii.Slash).Add(Xop_xnde_tag_.Tag__nowiki.Name_bry()).Add_byte(Byte_ascii.Gt); break; - case Xop_xnde_tag_.Tid_onlyinclude: // evaluate subs but toggle onlyinclude flag on/off + case Xop_xnde_tag_.Tid__onlyinclude: // evaluate subs but toggle onlyinclude flag on/off // boolean prv_val = ctx.Onlyinclude_enabled; // ctx.Onlyinclude_enabled = false; for (int i = 0; i < subs_len; i++) diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java index 295bff70b..43f3aae49 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java @@ -138,14 +138,14 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { int valid_inner_xnde_gt = atr_parser.Xnde_find_gt_find(src, name_bgn_pos, src_len); // check if , , or (which can exist inside tag) if (valid_inner_xnde_gt == String_.Find_none){ // not a switch (tag.Id()) { - case Xop_xnde_tag_.Tid_input: break; // noop; needed for Options which may have < in value; DATE:2014-07-04 + case Xop_xnde_tag_.Tid__input: break; // noop; needed for Options which may have < in value; DATE:2014-07-04 default: return ctx.Lxr_make_txt_(cur_pos); // escape text; EX: "
    " -> "<div
    "; SEE:it.u:; DATE:2014-02-03 } } else { // is a skip to if ( i == end_name_pos && ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl - && Bry_.Eq(atr_parser.Bry_obj().Val(), Xop_xnde_tag_.Tag_includeonly.Name_bry()) + && Bry_.Eq(atr_parser.Bry_obj().Val(), Xop_xnde_tag_.Tag__includeonly.Name_bry()) ) { pre2_hack = true; } @@ -171,11 +171,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { switch (ctx.Parse_tid()) { // NOTE: special logic to handle ; SEE: NOTE_1 below case Xop_parser_.Parse_tid_page_wiki: // NOTE: ignore if (a) wiki and (b) or switch (tag.Id()) { - case Xop_xnde_tag_.Tid_noinclude: - case Xop_xnde_tag_.Tid_onlyinclude: + case Xop_xnde_tag_.Tid__noinclude: + case Xop_xnde_tag_.Tid__onlyinclude: ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, end_pos, Xop_ignore_tkn.Ignore_tid_include_wiki)); return end_pos; - case Xop_xnde_tag_.Tid_nowiki: + case Xop_xnde_tag_.Tid__nowiki: force_xtn_for_nowiki = true; ctx_cur_tid_is_tblw_atr_owner = false; break; @@ -183,15 +183,15 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { break; case Xop_parser_.Parse_tid_tmpl: // NOTE: ignore if (a) tmpl and (b) switch (tag.Id()) { - case Xop_xnde_tag_.Tid_includeonly: + case Xop_xnde_tag_.Tid__includeonly: ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, end_pos, Xop_ignore_tkn.Ignore_tid_include_tmpl)); return end_pos; - case Xop_xnde_tag_.Tid_noinclude: + case Xop_xnde_tag_.Tid__noinclude: return Make_noinclude(ctx, tkn_mkr, root, src, src_len, bgn_pos, gt_pos, tag, atrs_bgn_pos - 1, tag_is_closing); // -1 b/c atrs_bgn_pos may be set past >; may need to adjust above logic; DATE:2014-06-24 - case Xop_xnde_tag_.Tid_nowiki: + case Xop_xnde_tag_.Tid__nowiki: force_xtn_for_nowiki = true; break; - case Xop_xnde_tag_.Tid_onlyinclude: + case Xop_xnde_tag_.Tid__onlyinclude: break; default: break; @@ -199,11 +199,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { break; case Xop_parser_.Parse_tid_page_tmpl: // NOTE: added late; SEE:comment test for "a - b -->c" switch (tag.Id()) { - case Xop_xnde_tag_.Tid_noinclude: + case Xop_xnde_tag_.Tid__noinclude: ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, end_pos, Xop_ignore_tkn.Ignore_tid_include_tmpl)); return end_pos; - case Xop_xnde_tag_.Tid_nowiki: // if encountered in page_tmpl stage, mark nowiki as xtn; added for nowiki_xnde_frag; DATE:2013-01-27 - case Xop_xnde_tag_.Tid_includeonly: // includeonly should be resolved during template stage; EX: ==A==; DATE:2014-02-12 + case Xop_xnde_tag_.Tid__nowiki: // if encountered in page_tmpl stage, mark nowiki as xtn; added for nowiki_xnde_frag; DATE:2013-01-27 + case Xop_xnde_tag_.Tid__includeonly: // includeonly should be resolved during template stage; EX: ==A==; DATE:2014-02-12 force_xtn_for_nowiki = true; break; } @@ -246,7 +246,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } } int end_rhs = -1, findPos = gtPos; - byte[] end_bry = Xop_xnde_tag_.Tag_noinclude.Xtn_end_tag(); int end_bry_len = end_bry.length; + byte[] end_bry = Xop_xnde_tag_.Tag__noinclude.Xtn_end_tag(); int end_bry_len = end_bry.length; if (tag_is_closing) //
    ; no end tag to search for; DATE:2014-05-02 end_rhs = gtPos; else { // ; search for end tag @@ -323,11 +323,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { boolean tag_ignore = false; int tagId = tag.Id(); - if (tagId == Xop_xnde_tag_.Tid_table || tag.Tbl_sub()) { // tbl tag; EX:
    ,,
    , + if (tagId == Xop_xnde_tag_.Tid__table || tag.Tbl_sub()) { // tbl tag; EX: ,," - , " " - , "
    , Tblw_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, gtPos + 1, tagId, atrs_bgn, atrs_end); return gtPos + 1; } - else if (prv_xnde_tagId == Xop_xnde_tag_.Tid_p && tagId == Xop_xnde_tag_.Tid_p) { + else if (prv_xnde_tagId == Xop_xnde_tag_.Tid__p && tagId == Xop_xnde_tag_.Tid__p) { ctx.Msg_log().Add_itm_none(Xop_xnde_log.Auto_closing_section, src, bgn_pos, bgn_pos); End_tag(ctx, root, prv_xnde, src, src_len, bgn_pos - 1, bgn_pos - 1, tagId, true, tag); } @@ -347,7 +347,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } Xop_xnde_tkn xnde = null; xnde = Xnde_bgn(ctx, tkn_mkr, root, tag, inline ? Xop_xnde_tkn.CloseMode_inline : Xop_xnde_tkn.CloseMode_open, src, bgn_pos, open_tag_end, atrs_bgn, atrs_end, atrs); - if (!inline && tag.Bgn_nde_mode() != Xop_xnde_tag_.Bgn_nde_mode_inline) + if (!inline && tag.Bgn_mode() != Xop_xnde_tag_.Bgn_mode__inline) ctx.Stack_add(xnde); if (tag_ignore) xnde.Tag_visible_(false); @@ -368,10 +368,10 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { case Xop_tkn_itm_.Tid_xnde: Xop_xnde_tkn xnde_tkn = (Xop_xnde_tkn)tkn; int stack_tag_id = xnde_tkn.Tag().Id(); - if (cur_tag_id == Xop_xnde_tag_.Tid_li) { + if (cur_tag_id == Xop_xnde_tag_.Tid__li) { switch (stack_tag_id) { - case Xop_xnde_tag_.Tid_ul: // ul / ol resets tag_stack for li; EX:
    • ; 2nd li is not nested in 1st - case Xop_xnde_tag_.Tid_ol: + case Xop_xnde_tag_.Tid__ul: // ul / ol resets tag_stack for li; EX:
      • ; 2nd li is not nested in 1st + case Xop_xnde_tag_.Tid__ol: return false; } } @@ -384,11 +384,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { private void Tblw_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int tagId, int atrs_bgn, int atrs_end) { byte wlxr_type = 0; switch (tagId) { - case Xop_xnde_tag_.Tid_table: wlxr_type = Xop_tblw_wkr.Tblw_type_tb; break; - case Xop_xnde_tag_.Tid_tr: wlxr_type = Xop_tblw_wkr.Tblw_type_tr; break; - case Xop_xnde_tag_.Tid_td: wlxr_type = Xop_tblw_wkr.Tblw_type_td; break; - case Xop_xnde_tag_.Tid_th: wlxr_type = Xop_tblw_wkr.Tblw_type_th; break; - case Xop_xnde_tag_.Tid_caption: wlxr_type = Xop_tblw_wkr.Tblw_type_tc; break; + case Xop_xnde_tag_.Tid__table: wlxr_type = Xop_tblw_wkr.Tblw_type_tb; break; + case Xop_xnde_tag_.Tid__tr: wlxr_type = Xop_tblw_wkr.Tblw_type_tr; break; + case Xop_xnde_tag_.Tid__td: wlxr_type = Xop_tblw_wkr.Tblw_type_td; break; + case Xop_xnde_tag_.Tid__th: wlxr_type = Xop_tblw_wkr.Tblw_type_th; break; + case Xop_xnde_tag_.Tid__caption: wlxr_type = Xop_tblw_wkr.Tblw_type_tc; break; } ctx.Tblw().Make_tkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, true, wlxr_type, Xop_tblw_wkr.Called_from_general, atrs_bgn, atrs_end); } @@ -396,11 +396,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { int typeId = 0; byte wlxr_type = 0; switch (tagId) { - case Xop_xnde_tag_.Tid_table: typeId = Xop_tkn_itm_.Tid_tblw_tb; wlxr_type = Xop_tblw_wkr.Tblw_type_tb; break; - case Xop_xnde_tag_.Tid_tr: typeId = Xop_tkn_itm_.Tid_tblw_tr; wlxr_type = Xop_tblw_wkr.Tblw_type_tr; break; - case Xop_xnde_tag_.Tid_td: typeId = Xop_tkn_itm_.Tid_tblw_td; wlxr_type = Xop_tblw_wkr.Tblw_type_td; break; - case Xop_xnde_tag_.Tid_th: typeId = Xop_tkn_itm_.Tid_tblw_th; wlxr_type = Xop_tblw_wkr.Tblw_type_th; break; - case Xop_xnde_tag_.Tid_caption: typeId = Xop_tkn_itm_.Tid_tblw_tc; wlxr_type = Xop_tblw_wkr.Tblw_type_tc; break; + case Xop_xnde_tag_.Tid__table: typeId = Xop_tkn_itm_.Tid_tblw_tb; wlxr_type = Xop_tblw_wkr.Tblw_type_tb; break; + case Xop_xnde_tag_.Tid__tr: typeId = Xop_tkn_itm_.Tid_tblw_tr; wlxr_type = Xop_tblw_wkr.Tblw_type_tr; break; + case Xop_xnde_tag_.Tid__td: typeId = Xop_tkn_itm_.Tid_tblw_td; wlxr_type = Xop_tblw_wkr.Tblw_type_td; break; + case Xop_xnde_tag_.Tid__th: typeId = Xop_tkn_itm_.Tid_tblw_th; wlxr_type = Xop_tblw_wkr.Tblw_type_th; break; + case Xop_xnde_tag_.Tid__caption: typeId = Xop_tkn_itm_.Tid_tblw_tc; wlxr_type = Xop_tblw_wkr.Tblw_type_tc; break; } Xop_tblw_tkn prv_tkn = ctx.Stack_get_tbl(); int prv_tkn_typeId = prv_tkn == null ? -1 : prv_tkn.Tkn_tid(); @@ -414,19 +414,19 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { Xop_xnde_tkn bgn_nde = (Xop_xnde_tkn)ctx.Stack_get(prv_xnde_pos); int bgn_tag_id = bgn_nde == null ? -1 : bgn_nde.Tag().Id(); - int end_nde_mode = end_tag.End_nde_mode(); + int end_nde_mode = end_tag.End_mode(); boolean force_end_tag_to_match_bgn_tag = false; switch (bgn_tag_id) { - case Xop_xnde_tag_.Tid_sub: if (end_tag_id == Xop_xnde_tag_.Tid_sup) force_end_tag_to_match_bgn_tag = true; break; - case Xop_xnde_tag_.Tid_sup: if (end_tag_id == Xop_xnde_tag_.Tid_sub) force_end_tag_to_match_bgn_tag = true; break; - case Xop_xnde_tag_.Tid_mark: if (end_tag_id == Xop_xnde_tag_.Tid_span) force_end_tag_to_match_bgn_tag = true; break; - case Xop_xnde_tag_.Tid_span: if (end_tag_id == Xop_xnde_tag_.Tid_font) force_end_tag_to_match_bgn_tag = true; break; + case Xop_xnde_tag_.Tid__sub: if (end_tag_id == Xop_xnde_tag_.Tid__sup) force_end_tag_to_match_bgn_tag = true; break; + case Xop_xnde_tag_.Tid__sup: if (end_tag_id == Xop_xnde_tag_.Tid__sub) force_end_tag_to_match_bgn_tag = true; break; + case Xop_xnde_tag_.Tid__mark: if (end_tag_id == Xop_xnde_tag_.Tid__span) force_end_tag_to_match_bgn_tag = true; break; + case Xop_xnde_tag_.Tid__span: if (end_tag_id == Xop_xnde_tag_.Tid__font) force_end_tag_to_match_bgn_tag = true; break; } if (force_end_tag_to_match_bgn_tag) { end_tag_id = bgn_tag_id; ctx.Msg_log().Add_itm_none(Xop_xnde_log.Sub_sup_swapped, src, bgn_pos, cur_pos); } - if (end_tag_id == Xop_xnde_tag_.Tid_table || end_tag.Tbl_sub()) { + if (end_tag_id == Xop_xnde_tag_.Tid__table || end_tag.Tbl_sub()) { Tblw_end(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, end_tag_id); return cur_pos; } @@ -437,10 +437,10 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { return cur_pos; } switch (end_nde_mode) { - case Xop_xnde_tag_.End_nde_mode_inline: // PATCH.WP: allows
        ,
        and many other variants + case Xop_xnde_tag_.End_mode__inline: // PATCH.WP: allows
        ,
        and many other variants Xnde_bgn(ctx, tkn_mkr, root, end_tag, Xop_xnde_tkn.CloseMode_inline, src, bgn_pos, cur_pos, Int_.Min_value, Int_.Min_value, null); // NOTE: atrs is null b/c
        will never have atrs return cur_pos; - case Xop_xnde_tag_.End_nde_mode_escape: // handle + case Xop_xnde_tag_.End_mode__escape: // handle ctx.Lxr_make_(false); ctx.Msg_log().Add_itm_none(Xop_xnde_log.Escaped_xnde, src, bgn_pos, cur_pos - 1); return cur_pos; @@ -592,7 +592,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { case Xop_parser_.Parse_tid_page_tmpl: { Xox_xnde xnde_xtn = null; switch (tag.Id()) { - case Xop_xnde_tag_.Tid_xowa_cmd: xnde_xtn = tkn_mkr.Xnde_xowa_cmd(); break; + case Xop_xnde_tag_.Tid__xowa_cmd: xnde_xtn = tkn_mkr.Xnde__xowa_cmd(); break; } if (xnde_xtn != null) { xnde_xtn.Xtn_parse(ctx.Wiki(), ctx, root, src, xnde); @@ -605,18 +605,18 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { int tag_id = tag.Id(); boolean escaped = false; switch (tag_id) { - case Xop_xnde_tag_.Tid_xowa_cmd: xnde_xtn = tkn_mkr.Xnde_xowa_cmd(); break; - case Xop_xnde_tag_.Tid_math: xnde_xtn = tkn_mkr.Xnde_math(); break; - case Xop_xnde_tag_.Tid_poem: xnde_xtn = tkn_mkr.Xnde_poem(); break; - case Xop_xnde_tag_.Tid_ref: xnde_xtn = gplx.xowa.xtns.cites.References_nde.Enabled ? tkn_mkr.Xnde_ref() : null; break; - case Xop_xnde_tag_.Tid_references: xnde_xtn = gplx.xowa.xtns.cites.References_nde.Enabled ? tkn_mkr.Xnde_references() : null; break; - case Xop_xnde_tag_.Tid_gallery: xnde_xtn = tkn_mkr.Xnde_gallery(); break; - case Xop_xnde_tag_.Tid_imageMap: xnde_xtn = tkn_mkr.Xnde_imageMap(); break; - case Xop_xnde_tag_.Tid_hiero: xnde_xtn = tkn_mkr.Xnde_hiero(); break; - case Xop_xnde_tag_.Tid_inputBox: xnde_xtn = tkn_mkr.Xnde_inputbox(); break; - case Xop_xnde_tag_.Tid_dynamicPageList: xnde_xtn = tkn_mkr.Xnde_dynamicPageList(); break; - case Xop_xnde_tag_.Tid_pages: { - xnde_xtn = tkn_mkr.Xnde_pages(); + case Xop_xnde_tag_.Tid__xowa_cmd: xnde_xtn = tkn_mkr.Xnde__xowa_cmd(); break; + case Xop_xnde_tag_.Tid__math: xnde_xtn = tkn_mkr.Xnde__math(); break; + case Xop_xnde_tag_.Tid__poem: xnde_xtn = tkn_mkr.Xnde__poem(); break; + case Xop_xnde_tag_.Tid__ref: xnde_xtn = gplx.xowa.xtns.cites.References_nde.Enabled ? tkn_mkr.Xnde__ref() : null; break; + case Xop_xnde_tag_.Tid__references: xnde_xtn = gplx.xowa.xtns.cites.References_nde.Enabled ? tkn_mkr.Xnde__references() : null; break; + case Xop_xnde_tag_.Tid__gallery: xnde_xtn = tkn_mkr.Xnde__gallery(); break; + case Xop_xnde_tag_.Tid__imageMap: xnde_xtn = tkn_mkr.Xnde__imageMap(); break; + case Xop_xnde_tag_.Tid__hiero: xnde_xtn = tkn_mkr.Xnde__hiero(); break; + case Xop_xnde_tag_.Tid__inputBox: xnde_xtn = tkn_mkr.Xnde__inputbox(); break; + case Xop_xnde_tag_.Tid__dynamicPageList: xnde_xtn = tkn_mkr.Xnde__dynamicPageList(); break; + case Xop_xnde_tag_.Tid__pages: { + xnde_xtn = tkn_mkr.Xnde__pages(); boolean enabled = ctx.Wiki().Xtn_mgr().Xtn_proofread().Enabled(); if (!enabled) { // if Page / Index ns does not exist, disable xtn and escape content; DATE:2014-11-28 escaped = true; @@ -624,36 +624,39 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } break; } - case Xop_xnde_tag_.Tid_pagequality: xnde_xtn = tkn_mkr.Xnde_pagequality(); break; - case Xop_xnde_tag_.Tid_pagelist: xnde_xtn = tkn_mkr.Xnde_pagelist(); break; - case Xop_xnde_tag_.Tid_section: xnde_xtn = tkn_mkr.Xnde_section(); break; - case Xop_xnde_tag_.Tid_categoryList: xnde_xtn = tkn_mkr.Xnde_categoryList(); break; - case Xop_xnde_tag_.Tid_source: // changed to be synonymn of syntax_highlight; DATE:2014-06-24 - case Xop_xnde_tag_.Tid_syntaxHighlight: xnde_xtn = tkn_mkr.Xnde_syntaxHighlight(); break; - case Xop_xnde_tag_.Tid_score: xnde_xtn = tkn_mkr.Xnde_score(); break; - case Xop_xnde_tag_.Tid_translate: xnde_xtn = tkn_mkr.Xnde_translate(); break; - case Xop_xnde_tag_.Tid_languages: xnde_xtn = tkn_mkr.Xnde_languages(); break; - case Xop_xnde_tag_.Tid_templateData: xnde_xtn = tkn_mkr.Xnde_templateData(); break; - case Xop_xnde_tag_.Tid_rss: xnde_xtn = tkn_mkr.Xnde_rss(); break; - case Xop_xnde_tag_.Tid_quiz: xnde_xtn = tkn_mkr.Xnde_quiz(); break; - case Xop_xnde_tag_.Tid_indicator: xnde_xtn = tkn_mkr.Xnde_indicator(); break; - case Xop_xnde_tag_.Tid_xowa_html: xnde_xtn = tkn_mkr.Xnde_xowa_html(); break; - case Xop_xnde_tag_.Tid_graph: xnde_xtn = tkn_mkr.Xnde_graph(); break; - case Xop_xnde_tag_.Tid_listing_buy: - case Xop_xnde_tag_.Tid_listing_do: - case Xop_xnde_tag_.Tid_listing_drink: - case Xop_xnde_tag_.Tid_listing_eat: - case Xop_xnde_tag_.Tid_listing_listing: - case Xop_xnde_tag_.Tid_listing_see: - case Xop_xnde_tag_.Tid_listing_sleep: xnde_xtn = tkn_mkr.Xnde_listing(tag_id); break; - case Xop_xnde_tag_.Tid_timeline: + case Xop_xnde_tag_.Tid__pagequality: xnde_xtn = tkn_mkr.Xnde__pagequality(); break; + case Xop_xnde_tag_.Tid__pagelist: xnde_xtn = tkn_mkr.Xnde__pagelist(); break; + case Xop_xnde_tag_.Tid__section: xnde_xtn = tkn_mkr.Xnde__section(); break; + case Xop_xnde_tag_.Tid__categoryList: xnde_xtn = tkn_mkr.Xnde__categoryList(); break; + case Xop_xnde_tag_.Tid__source: // changed to be synonymn of syntax_highlight; DATE:2014-06-24 + case Xop_xnde_tag_.Tid__syntaxHighlight: xnde_xtn = tkn_mkr.Xnde__syntaxHighlight(); break; + case Xop_xnde_tag_.Tid__score: xnde_xtn = tkn_mkr.Xnde__score(); break; + case Xop_xnde_tag_.Tid__translate: xnde_xtn = tkn_mkr.Xnde__translate(); break; + case Xop_xnde_tag_.Tid__languages: xnde_xtn = tkn_mkr.Xnde__languages(); break; + case Xop_xnde_tag_.Tid__templateData: xnde_xtn = tkn_mkr.Xnde__templateData(); break; + case Xop_xnde_tag_.Tid__rss: xnde_xtn = tkn_mkr.Xnde__rss(); break; + case Xop_xnde_tag_.Tid__quiz: xnde_xtn = tkn_mkr.Xnde__quiz(); break; + case Xop_xnde_tag_.Tid__indicator: xnde_xtn = tkn_mkr.Xnde__indicator(); break; + case Xop_xnde_tag_.Tid__xowa_html: xnde_xtn = tkn_mkr.Xnde__xowa_html(); break; + case Xop_xnde_tag_.Tid__graph: xnde_xtn = tkn_mkr.Xnde__graph(); break; + case Xop_xnde_tag_.Tid__random_selection: xnde_xtn = tkn_mkr.Xnde__random_selection(); break; + case Xop_xnde_tag_.Tid__tabber: xnde_xtn = tkn_mkr.Xnde__tabber(); break; + case Xop_xnde_tag_.Tid__tabview: xnde_xtn = tkn_mkr.Xnde__tabview(); break; + case Xop_xnde_tag_.Tid__listing_buy: + case Xop_xnde_tag_.Tid__listing_do: + case Xop_xnde_tag_.Tid__listing_drink: + case Xop_xnde_tag_.Tid__listing_eat: + case Xop_xnde_tag_.Tid__listing_listing: + case Xop_xnde_tag_.Tid__listing_see: + case Xop_xnde_tag_.Tid__listing_sleep: xnde_xtn = tkn_mkr.Xnde__listing(tag_id); break; + case Xop_xnde_tag_.Tid__timeline: boolean log_wkr_enabled = Timeline_log_wkr != Xop_log_basic_wkr.Null; if (log_wkr_enabled) Timeline_log_wkr.Log_end_xnde(ctx.Page(), Xop_log_basic_wkr.Tid_timeline, src, xnde); ctx.Page().Html_data().Head_mgr().Itm__timeline().Enabled_y_(); break; - case Xop_xnde_tag_.Tid_xowa_tag_bgn: - case Xop_xnde_tag_.Tid_xowa_tag_end: + case Xop_xnde_tag_.Tid__xowa_tag_bgn: + case Xop_xnde_tag_.Tid__xowa_tag_end: break; - case Xop_xnde_tag_.Tid_pre: // NOTE: pre must be an xtn, but does not create an xtn node (it gobbles up everything between); still need to touch the para_wkr; DATE:2014-02-20 + case Xop_xnde_tag_.Tid__pre: // NOTE: pre must be an xtn, but does not create an xtn node (it gobbles up everything between); still need to touch the para_wkr; DATE:2014-02-20 ctx.Para().Process_block__xnde(tag, Xop_xnde_tag.Block_bgn); if (Bry_find_.Find_fwd(src, Byte_ascii.Nl, xnde.Tag_open_end(), xnde.Tag_close_bgn()) != Bry_find_.Not_found) ctx.Para().Process_nl(ctx, root, src, xnde.Tag_open_bgn(), xnde.Tag_open_bgn()); @@ -670,7 +673,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { xnde_xtn.Xtn_parse(ctx.Wiki(), ctx, root, src, xnde); } catch (Exception e) { - String err_msg = String_.Format("failed to render extension: title={0} excerpt={1} err={2}", ctx.Page().Ttl().Full_txt() + String err_msg = String_.Format("failed to render extension: title={0} excerpt={1} err={2}", ctx.Page().Ttl().Full_txt_w_ttl_case() , Bry_.Mid(src, xnde.Tag_open_end(), xnde.Tag_close_bgn()) , Err_.Message_gplx_log(e)); if (Env_.Mode_testing()) @@ -691,7 +694,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { ctx.Subs_add(root, rv); return rv; } - private static final byte[] + private static final byte[] Bry_escape_lt_slash = Bry_.new_a7("</") ; public static int Find_gt_pos(Xop_ctx ctx, byte[] src, int cur_pos, int src_len) { // UNUSED diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 1056a2a1c..946659822 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -19,21 +19,22 @@ package gplx.xowa.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.history.*; import gplx.xowa.langs.*; import gplx.xowa.langs.specials.*; import gplx.xowa.specials.*; -import gplx.xowa.specials.allPages.*; import gplx.xowa.specials.search.*; import gplx.xowa.specials.nearby.*; import gplx.xowa.specials.randoms.*; import gplx.xowa.specials.statistics.*; import gplx.xowa.xtns.translates.*; import gplx.xowa.specials.movePage.*; +import gplx.xowa.specials.allPages.*; import gplx.xowa.specials.nearby.*; import gplx.xowa.specials.randoms.*; import gplx.xowa.specials.statistics.*; import gplx.xowa.xtns.translates.*; import gplx.xowa.specials.movePage.*; import gplx.xowa.specials.xowa.system_data.*; import gplx.xowa.specials.xowa.default_tab.*; import gplx.xowa.specials.xowa.popup_history.*; import gplx.xowa.specials.xowa.file_browsers.*; import gplx.xowa.specials.xowa.diags.*; import gplx.xowa.xtns.wdatas.specials.*; +import gplx.xowa.addons.searchs.specials.*; import gplx.xowa.users.data.*; import gplx.xowa.users.bmks.*; public class Xows_mgr { private final Hash_adp_bry hash; public Xows_mgr(Xowe_wiki wiki, Xol_lang_itm lang) { hash = Hash_adp_bry.ci_u8(lang.Case_mgr()); page_allpages = new Xows_page_allpages(wiki); - page_search = new Xows_page__search(wiki); + page_search = new Srch_special_page(wiki); page_random = new Xows_page_random(wiki); Evt_lang_changed(wiki.Lang()); } public Xows_page_allpages Page_allpages() {return page_allpages;} private final Xows_page_allpages page_allpages; - public Xows_page__search Page_search() {return page_search;} private final Xows_page__search page_search; + public Srch_special_page Page_search() {return page_search;} private final Srch_special_page page_search; public Xows_page_random Page_random() {return page_random;} private final Xows_page_random page_random; public Xop_randomRootPage_page Page_randomRootPage() {return page_randomRootPage;} private final Xop_randomRootPage_page page_randomRootPage = new Xop_randomRootPage_page(); public Xou_history_html Page_history() {return page_history;} private final Xou_history_html page_history = new Xou_history_html(); 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 869394e62..46eaf11a0 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 @@ -117,7 +117,7 @@ public class Xows_page_allpages implements gplx.core.brys.Bfr_arg, GfoInvkAble, rslt_prv = rslt_prv2; return true; } 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"); + 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) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001(); @@ -133,7 +133,7 @@ public class Xows_page_allpages implements gplx.core.brys.Bfr_arg, GfoInvkAble, int msg_id = fwd ? Xol_msg_itm_.Id_sp_allpages_fwd : Xol_msg_itm_.Id_sp_allpages_bwd; Xol_msg_itm msg_itm = wiki.Lang().Msg_mgr().Itm_by_id_or_null(msg_id); Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512().Mkr_rls(); - byte[] lbl_text = msg_itm.Fmt(tmp_bfr, ttl.Full_txt()); + byte[] lbl_text = msg_itm.Fmt(tmp_bfr, ttl.Full_txt_w_ttl_case()); byte[] args__rest = arg_hash.Concat(tmp_bfr, Bry_arg_ns, Bry_arg_hideredirects); byte[] arg_from = gplx.langs.htmls.encoders.Gfo_url_encoder_.Id.Encode(ttl.Page_txt_wo_qargs()); return html_list_end.Bld_bry_many(bfr, arg_from, args__rest, lbl_text); @@ -165,7 +165,7 @@ public class Xows_page_allpages implements gplx.core.brys.Bfr_arg, GfoInvkAble, } public static final String Invk_html_all_ = "html_all_", Invk_html_list_grp_ = "html_list_grp_", Invk_html_list_itm_normal_ = "html_list_itm_normal_", Invk_html_list_itm_redirect_ = "html_list_itm_redirect_" , Invk_itms_per_page_ = "itms_per_page_", Invk_itms_per_grp_ = "itms_per_grp_", Invk_show_redirects_ = "show_redirects_"; - public static final String GRP_KEY = "xowa.special.allpages"; + public static final String GRP_KEY = "xowa.special.allpages"; } class Xos_pagelist_html_itm_fmtr implements gplx.core.brys.Bfr_arg { public Xos_pagelist_html_itm_fmtr(Xows_page_allpages mgr, Xowe_wiki wiki) { @@ -190,10 +190,10 @@ class Xos_pagelist_html_itm_fmtr implements gplx.core.brys.Bfr_arg { 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_wtr.Build_to_bry(wiki, ttl); - byte[] title = Xoh_html_wtr.Ttl_to_title(ttl.Full_txt()); + byte[] title = Xoh_html_wtr.Ttl_to_title(ttl.Full_txt_w_ttl_case()); 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; - fmtr.Bld_bfr_many(bfr, itm_pct, href, title, ttl.Full_txt(), cls); + fmtr.Bld_bfr_many(bfr, itm_pct, href, title, ttl.Full_txt_w_ttl_case(), cls); } } } 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 7c69fa93b..8ea9271f3 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 @@ -124,8 +124,8 @@ public class Xows_page_allpages_tst { class Xows_page_allpages_fxt { public Xows_page_allpages_fxt Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); allpages = wiki.Special_mgr().Page_allpages(); GfoInvkAble_.InvkCmd_val(allpages, Xows_page_allpages.Invk_itms_per_page_, 5); } 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 dba317358..033f183c9 100644 --- a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java +++ b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java @@ -71,8 +71,8 @@ public class Move_page implements Xows_page { fmtr_all.Bld_bfr_many(tmp_bfr , msg_mgr.Val_by_key_obj("move-page-legend") , Bry_.Add(Xoh_href_.Bry__wiki, src_ttl.Full_db()) - , gplx.langs.htmls.Gfh_utl.Escape_html_as_bry(src_ttl.Full_txt()) - , src_ttl.Full_txt() + , gplx.langs.htmls.Gfh_utl.Escape_html_as_bry(src_ttl.Full_txt_w_ttl_case()) + , src_ttl.Full_txt_w_ttl_case() , msg_mgr.Val_by_key_obj("newtitle") , ns_list_fmtr , args.Trg_ttl() @@ -136,7 +136,7 @@ class Move_trg_ns_list_fmtr implements gplx.core.brys.Bfr_arg { fmtr.Bld_bfr_many(bfr, ns.Id(), bry_selected, ns.Name_combo()); } } - private static final byte[] Bry_selected = Bry_.new_a7(" selected=''"); + private static final byte[] Bry_selected = Bry_.new_a7(" selected=''"); private Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" , " " @@ -174,7 +174,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_a7() + 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/randoms/Rndm_core_tbl.java b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_core_tbl.java index 828eddba3..123c6acb3 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Rndm_core_tbl.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_core_tbl.java @@ -29,7 +29,7 @@ public class Rndm_core_tbl implements Rls_able { fld_interval = flds.Add_int("rndm_interval"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, "core", fld_uid)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, "core", fld_uid)));} public void Upsert(int uid, String where_sql, int total, int interval) { conn.Stmt_delete(tbl_name, fld_uid).Crt_int(fld_uid, uid).Exec_delete(); conn.Stmt_insert(tbl_name, flds).Val_int(fld_uid, uid).Val_str(fld_where_sql, where_sql).Val_int(fld_total, total).Val_int(fld_interval, interval).Exec_insert(); diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Rndm_mgr.java b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_mgr.java index 577823a29..52a66bbb1 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Rndm_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_mgr.java @@ -30,7 +30,7 @@ public class Rndm_mgr implements Rls_able { } public void Rebuild(int uid, String where_sql, int interval) { int total_count = 0; List_adp rng_list = List_adp_.new_(); - Db_conn conn = page_tbl.Conn(); + Db_conn conn = page_tbl.conn; Db_stmt stmt = conn.Stmt_select_order(page_tbl.Tbl_name(), String_.Ary(page_tbl.Fld_page_id()), String_.Ary_empty, page_tbl.Fld_page_id()); Db_rdr rdr = stmt.Exec_select__rls_auto(); try { @@ -69,7 +69,7 @@ public class Rndm_mgr implements Rls_able { String sql = fmt_sql.Bld_many_to_str(bfr, page_tbl.Tbl_name(), page_tbl.Fld_page_id(), where_sql, page_id_bgn, offset); Db_rdr rdr = Db_rdr_.Empty; try { - rdr = page_tbl.Conn().Exec_sql_as_rdr_v2(sql); + rdr = page_tbl.conn.Exec_rdr(sql); return rdr.Move_next() ? rdr.Read_int(page_tbl.Fld_page_id()) : -1; } finally {rdr.Rls();} diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Rndm_range_tbl.java b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_range_tbl.java index 1645bd96a..9e7d68af4 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Rndm_range_tbl.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Rndm_range_tbl.java @@ -28,7 +28,7 @@ public class Rndm_range_tbl implements Rls_able { fld_rng_page_id = flds.Add_int("rng_page_id"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, "core", fld_rng_uid, fld_rng_idx)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, "core", fld_rng_uid, fld_rng_idx)));} public void Insert_bgn(int uid) { conn.Stmt_delete(tbl_name, fld_rng_uid).Crt_int(fld_rng_uid, uid).Exec_delete(); stmt_insert = conn.Stmt_insert(tbl_name, flds); @@ -43,7 +43,7 @@ public class Rndm_range_tbl implements Rls_able { if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_rng_uid, fld_rng_idx); Db_rdr rdr = stmt_select.Clear().Val_int(fld_rng_uid, core_uid).Val_int(fld_rng_idx, rng_idx).Exec_select__rls_manual(); try {return rdr.Move_next() ? rdr.Read_int(fld_rng_page_id) : -1;} - catch (Exception e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to get rndm_idx; url=~{0} core_uid=~{1} rng_idx=~{2} err=~{3}", conn.Conn_info().Xto_api(), core_uid, rng_idx, Err_.Message_gplx_log(e)); return -1;} + catch (Exception e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to get rndm_idx; url=~{0} core_uid=~{1} rng_idx=~{2} err=~{3}", conn.Conn_info().Db_api(), core_uid, rng_idx, Err_.Message_gplx_log(e)); return -1;} finally {rdr.Rls();} } public void Rls() { diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_db_wkr.java b/400_xowa/src/gplx/xowa/specials/search/Srch_db_wkr.java deleted file mode 100644 index 6458035f1..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_db_wkr.java +++ /dev/null @@ -1,130 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; -import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.wikis.nss.*; import gplx.xowa.langs.cases.*; -import gplx.xowa.specials.search.crts.*; -public class Srch_db_wkr { - private Xol_case_mgr drd_case_mgr; - public Srch_rslt_itm[] Search_by_drd(Cancelable cxl, Srch_rslt_lnr rslt_lnr, Xow_wiki wiki, byte[] search, int search_results_max) { - Xows_ns_mgr ns_mgr = new Xows_ns_mgr(); ns_mgr.Add_main_if_empty(); - Srch_qry qry = new Srch_qry(search, 0, search_results_max, ns_mgr, Bool_.Y, new gplx.xowa.wikis.domains.Xow_domain_itm[] {wiki.Domain_itm()}); - Srch_rslt_hash cache = new Srch_rslt_hash(); cache.Init_by_db(cxl, search, wiki.Data__core_mgr().Db__search().Tbl__search_word()); - if (drd_case_mgr == null) drd_case_mgr = Xol_case_mgr_.U8(); - Search(cxl, rslt_lnr, cache, wiki, drd_case_mgr, qry); - int len = cache.Count(); - Srch_rslt_itm[] rv = new Srch_rslt_itm[len]; - for (int i = 0; i < len; ++i) - rv[i] = cache.Get_at(i); - return rv; - } - @gplx.Internal protected void Search(Cancelable cxl, Srch_rslt_lnr rslt_lnr, Srch_rslt_hash cache, Xow_wiki wiki, Xol_case_mgr case_mgr, Srch_qry qry) { - // get search_words - Xowd_db_file search_db = wiki.Data__core_mgr().Db__search(); - Xoa_app_.Usr_dlg().Prog_many("", "", "search started (please wait)"); - Srch_crt_node ttl_matcher = cache.Ttl_matcher(); - if (ttl_matcher == null) { - cache.Init_by_db(cxl, case_mgr.Case_build_lower(qry.search_raw), search_db.Tbl__search_word()); // lower-case search - ttl_matcher = cache.Ttl_matcher(); - } - // do some init - int rslts_wanted = qry.itms_end - qry.itms_bgn; - Xowd_db_file core_db = wiki.Data__core_mgr().Db__core(); - Xowd_page_tbl page_tbl = core_db.Tbl__page(); - Xowd_search_link_tbl link_tbl = search_db.Tbl__search_link(); - Srch_word_row[] word_ary = cache.Words(); int word_ary_len = word_ary.length; - // read pages for each word from db - Db_attach_rdr attach_rdr = new Db_attach_rdr(search_db.Conn(), "page_db", core_db.Url()); - attach_rdr.Attach(); - int total_found = 0; - try { - while (true) { - boolean found_none = true; - for (int i = 0; i < word_ary_len; ++i) { // loop each word to get rslts_wanted - if (cxl.Canceled()) return; - Srch_word_row word = word_ary[i]; - if (word.Rslts_done()) continue; // last db_search for word returned 0 results; don't search again; - int offset = word.Rslts_offset(); - Xoa_app_.Usr_dlg().Prog_many("", "", "searching; wiki=~{0} total=~{1} offset=~{2} index=~{3} word=~{4}", wiki.Domain_str(), word_ary_len, offset, i, word.text); - String sql = search_fmt.Bld_many_to_str_auto_bfr(link_tbl.Tbl_name(), link_tbl.Fld_page_id(), link_tbl.Fld_word_id(), word.id, offset); // need to return enough results to fill qry.page_len as many results may be discarded below; DATE:2015-04-24 - int rslts_found = Search_pages(cxl, rslt_lnr, cache, wiki, case_mgr, qry, page_tbl, attach_rdr, sql, ttl_matcher, word, rslts_wanted); - total_found += rslts_found; - if (rslts_found == -1) return; // canceled - else if (rslts_found > 0) found_none = false; // NOTE: do not reverse and do rslts_found == 0; want to check if any word returns results; - } - if (found_none) {cache.Done_y_(); break;} - if (total_found >= rslts_wanted) break; - } - cache.Itms_end_(qry.itms_end); - cache.Sort(); - } - catch (Exception e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "error during search; wiki=~{0} total=~{1} err=~{2}", wiki.Domain_str(), word_ary_len, Err_.Message_gplx_log(e));} - finally {attach_rdr.Detach();} - } - private int Search_pages(Cancelable cxl, Srch_rslt_lnr rslt_lnr, Srch_rslt_hash cache, Xow_wiki wiki, Xol_case_mgr case_mgr, Srch_qry qry - , Xowd_page_tbl page_tbl, Db_attach_rdr attach_rdr, String sql, Srch_crt_node ttl_matcher, Srch_word_row word, int rslts_wanted) { - int rslts_found = 0; - Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); - Db_rdr rdr = attach_rdr.Exec_as_rdr(sql); - try { - while (rdr.Move_next()) { - if (cxl.Canceled()) return -1; - word.Rslts_offset_add_1(); - int page_ns = rdr.Read_int(page_tbl.Fld_page_ns()); - if (!qry.ns_mgr.Has(page_ns)) continue; // ignore: ns doesn't match - byte[] page_ttl = rdr.Read_bry_by_str(page_tbl.Fld_page_title()); - // Io_mgr.Instance.AppendFilStr("C:\\temp.txt", String_.new_u8(word.Text()) + "|" + Int_.To_str(page_ns) + "|" + String_.new_u8(page_ttl) + "\n"); - if (!ttl_matcher.Matches(case_mgr, page_ttl)) continue; // ignore: ttl doesn't match ttl_matcher - Xow_ns ns = ns_mgr.Ids_get_or_null(page_ns); - byte[] page_ttl_w_ns = ns.Gen_ttl(page_ttl); - if (cache.Has(page_ttl_w_ns)) continue; // ignore: page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" - Srch_rslt_itm row = new Srch_rslt_itm(wiki.Domain_bry(), wiki.Ttl_parse(page_ttl_w_ns), rdr.Read_int(page_tbl.Fld_page_id()), rdr.Read_int(page_tbl.Fld_page_len())); - rslt_lnr.Notify_rslt_found(row); - if (++rslts_found == rslts_wanted) break; // stop: found enough results; DATE:2015-04-24 - } - } finally {rdr.Rls();} - if (rslts_found == 0) word.Rslts_done_y_(); // read through entire rdr and nothing found; mark word done - return rslts_found; - } - public Db_stmt New_qry(Db_conn conn, String page_db_alias, Xowd_page_tbl page, Xowd_search_link_tbl link, int offset) { - Db_qry qry = Db_qry_.select_() - .Cols_w_tbl_("p", page.Fld_page_id(), page.Fld_page_ns(), page.Fld_page_title(), page.Fld_page_len()) - .From_(page_db_alias, page.Tbl_name(), "p") - .Join_(link.Tbl_name(), "l", Db_qry_.New_join__join(link.Fld_page_id(), page.Fld_page_id(), "p")) - .Where_(Db_crt_.New_eq("l", link.Fld_word_id(), -1)) - .Order_("p", page.Fld_page_len(), Bool_.N) - .Offset_(offset) - ; -// qry_mgr.Add_ns(qry, page); // qry.Where_and_(page.Fld_page_ns(), -1) - return conn.Stmt_new(qry); - } - private static final Bry_fmt search_fmt = Bry_fmt.New - ( String_.Concat_lines_nl_skip_last - ( "SELECT p.page_id" - , ", p.page_namespace" - , ", p.page_title" - , ", p.page_len" - , "FROM page p" - , " JOIN ~{tbl_link} l ON p.page_id = l.~{col_link_page_id} " - , "WHERE l.~{col_link_word_id} = ~{word_id}" - , "ORDER BY p.page_len DESC" - , "LIMIT -1" // NOTE:LIMIT needed when OFFSET is specified; -1 LIMIT means infinite; "If the LIMIT expression evaluates to a negative value, then there is no upper bound on the number of rows returned"; http://sqlite.org/lang_select.html - , "OFFSET ~{offset};" - ), "tbl_link", "col_link_page_id", "col_link_word_id", "word_id", "offset"); -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_qry.java b/400_xowa/src/gplx/xowa/specials/search/Srch_qry.java deleted file mode 100644 index 25e78fd93..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_qry.java +++ /dev/null @@ -1,44 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.domains.*; -class Srch_qry { - private final List_adp cmd_list = List_adp_.new_(); - public Srch_qry(byte[] search_raw, int page_idx, int page_len, Xows_ns_mgr ns_mgr, boolean async_db, Xow_domain_itm[] wiki_domains) { - this.search_raw = search_raw; this.page_idx = page_idx; this.page_len = page_len; this.ns_mgr = ns_mgr; this.async_db = async_db; this.wiki_domains = wiki_domains; - this.itms_bgn = page_idx * page_len; - this.itms_end = itms_bgn + page_len; - this.page_max = page_idx; // default page_max to page_idx; adjust later when all results are known - this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, search_raw, ns_mgr.To_hash_key()); - this.special_link_base_href = Bry_.Add(Bry_.new_a7("Special:Search/"), search_raw, Bry_.new_a7("?fulltext=y")); - } - public final byte[] key; - public final byte[] search_raw; - public final int page_idx; - public final int page_len; - public final int itms_bgn; - public final int itms_end; - public final Xows_ns_mgr ns_mgr; - public final Xow_domain_itm[] wiki_domains; - public final byte[] special_link_base_href; - public final boolean async_db; - public int page_max; - public int Cmds__len() {return cmd_list.Count();} - public Xows_ui_cmd Cmds__get_at(int i) {return (Xows_ui_cmd)cmd_list.Get_at(i);} - public void Cmds__add(Xows_ui_cmd cmd) {cmd_list.Add(cmd);} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_hash.java b/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_hash.java deleted file mode 100644 index a76a1c620..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_hash.java +++ /dev/null @@ -1,42 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.specials.search.crts.*; -class Srch_rslt_hash { // per search request; EX: 'Earth* AND (History OR Future) AND -"middle earth"' - private final Ordered_hash hash = Ordered_hash_.New_bry(); - public Srch_crt_node Ttl_matcher() {return ttl_matcher;} private Srch_crt_node ttl_matcher; - public Srch_word_row[] Words() {return words;} private Srch_word_row[] words; // words to search db; EX: earth, history, future but not "middle earth" (since not'ed) - public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; // marks if db search is done - public int Count() {return hash.Count();} - public int Itms_end() {return itms_end;} public void Itms_end_(int v) {itms_end = v;} private int itms_end; - public void Init_by_db(Cancelable cxl, byte[] raw, gplx.xowa.wikis.data.tbls.Xowd_search_word_tbl word_tbl) { - this.ttl_matcher = new Srch_crt_parser().Parse(raw); - this.words = new Xows_db_matcher_bldr().Gather_words_for_db(cxl, ttl_matcher, word_tbl); - } - public boolean Has(byte[] key) {return hash.Has(key);} - public Srch_rslt_itm Get_at(int i) {return (Srch_rslt_itm)hash.Get_at(i);} - public void Add(Srch_rslt_itm itm) {hash.Add(itm.page_ttl.Full_db(), itm);} - public void Get_between(Srch_rslt_list search_ui, int bgn, int end) { - if (bgn >= hash.Count()) return; // requested start not in cache; exit - for (int i = bgn; i < end; ++i) { - if (i >= hash.Count()) break; - search_ui.Add((Srch_rslt_itm)hash.Get_at(i)); - } - } - public void Sort() {hash.Sort_by(Srch_rslt_itm_sorter.Page_len_dsc);} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_itm.java b/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_itm.java deleted file mode 100644 index 69eb78732..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_itm.java +++ /dev/null @@ -1,40 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -public class Srch_rslt_itm { - public final byte[] key; - public final byte[] wiki_bry; - public final Xoa_ttl page_ttl; - public final int page_id; - public final int page_len; - public Srch_rslt_itm(byte[] wiki_bry, Xoa_ttl page_ttl, int page_id, int page_len) { - this.wiki_bry = wiki_bry; - this.page_ttl = page_ttl; - this.page_id = page_id; - this.page_len = page_len; - this.key = Bry_.Add(wiki_bry, Byte_ascii.Pipe_bry, page_ttl.Full_db()); - } -} -class Srch_rslt_itm_sorter implements gplx.core.lists.ComparerAble { - public int compare(Object lhsObj, Object rhsObj) { - Srch_rslt_itm lhs = (Srch_rslt_itm)lhsObj; - Srch_rslt_itm rhs = (Srch_rslt_itm)rhsObj; - return -Int_.Compare(lhs.page_len, rhs.page_len); - } - public static final Srch_rslt_itm_sorter Page_len_dsc = new Srch_rslt_itm_sorter(); Srch_rslt_itm_sorter() {} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_list.java b/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_list.java deleted file mode 100644 index 8b89c8a2a..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_rslt_list.java +++ /dev/null @@ -1,24 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -class Srch_rslt_list { - private final List_adp list = List_adp_.new_(); - public int Len() {return list.Count();} - public void Add(Srch_rslt_itm rslt) {list.Add(rslt);} - public Srch_rslt_itm Get_at(int i) {return (Srch_rslt_itm)list.Get_at(i);} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Srch_word_row.java b/400_xowa/src/gplx/xowa/specials/search/Srch_word_row.java deleted file mode 100644 index 46094355a..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Srch_word_row.java +++ /dev/null @@ -1,36 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -public class Srch_word_row { - public Srch_word_row(int id, byte[] text, int page_count) {this.id = id; this.text = text; this.page_count = page_count;} - public final int id; - public final byte[] text; - public final int page_count; - public int Rslts_offset() {return rslts_offset;} private int rslts_offset; - public boolean Rslts_done() {return rslts_done;} private boolean rslts_done; - public void Rslts_offset_add_1() {++rslts_offset;} - public void Rslts_done_y_() {rslts_done = true;} -} -class Srch_word_row_sorter implements gplx.core.lists.ComparerAble { - public int compare(Object lhsObj, Object rhsObj) { - Srch_word_row lhs = (Srch_word_row)lhsObj; - Srch_word_row rhs = (Srch_word_row)rhsObj; - return -Int_.Compare(lhs.page_count, rhs.page_count); - } - public static final Srch_word_row_sorter Page_count_dsc = new Srch_word_row_sorter(); Srch_word_row_sorter() {} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java deleted file mode 100644 index efd24bcaf..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java +++ /dev/null @@ -1,111 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; import gplx.xowa.wikis.data.tbls.*; -public class Xog_search_suggest_cmd implements GfoInvkAble, Cancelable { - private Xowe_wiki wiki; private byte[] search_bry; private Xosrh_page_mgr searcher; private int max_results, all_pages_extend, all_pages_min; - public Xog_search_suggest_cmd(Xoae_app app, Xog_search_suggest_mgr mgr) { - this.app = app; this.mgr = mgr; - } private Xoae_app app; Xog_search_suggest_mgr mgr; Bry_bfr tmp_bfr = Bry_bfr.reset_(255); List_adp rslts_1 = List_adp_.new_(), rslts_2 = List_adp_.new_(); - public void Init(Xowe_wiki wiki, byte[] search_bry, int max_results, byte search_mode, int all_pages_extend, int all_pages_min) { - this.wiki = wiki; this.search_bry = search_bry; this.max_results = max_results; - this.search_mode = search_mode; this.all_pages_extend = all_pages_extend; this.all_pages_min = all_pages_min; - searcher = new Xosrh_page_mgr(); - } - private byte search_mode; - public byte[] Search_bry() {return search_bry;} - public boolean Canceled() {return canceled;} - public void Cancel() {this.canceled = true;} private boolean canceled; - public void Cancel_reset() {this.canceled = false;} - public boolean Working() {return working;} public void Working_(boolean v) {working = v;} private boolean working; - public List_adp Results() {return rslts_2;} - public void Search() { - try { // NOTE: must handle any errors in async mode - canceled = false; - working = true; - boolean pass = false; - switch (search_mode) { - case Xog_search_suggest_mgr.Tid_search_mode_all_pages_v2: pass = Search_by_all_pages_v2(); break; - case Xog_search_suggest_mgr.Tid_search_mode_all_pages_v1: pass = Search_by_all_pages_v1(); break; - case Xog_search_suggest_mgr.Tid_search_mode_search: pass = Search_by_search(); break; - } - if (!pass) return; - GfoInvkAble_.InvkCmd(app.Gui_mgr().Kit().New_cmd_sync(mgr), Xog_search_suggest_mgr.Invk_notify); - working = false; - } - catch(Exception e) { - app.Usr_dlg().Prog_many("", "", "error during search: err=~{0}", Err_.Message_gplx_full(e)); - } - } - private boolean Search_by_all_pages_v2() { - rslts_2.Clear(); - Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_bry); if (search_ttl == null) return false; - byte[] search_ttl_bry = search_ttl.Page_db(); - wiki.Db_mgr().Load_mgr().Load_ttls_for_search_suggest(this, rslts_2, search_ttl.Ns(), search_ttl_bry, max_results, all_pages_min, all_pages_extend, true, false); - return true; - } - private boolean Search_by_all_pages_v1() { - rslts_2.Clear(); - Xowd_page_itm rslt_nxt = new Xowd_page_itm(); - Xowd_page_itm rslt_prv = new Xowd_page_itm(); - Xoa_ttl search_ttl = Xoa_ttl.parse(wiki, search_bry); if (search_ttl == null) return false; - byte[] search_ttl_bry = search_ttl.Page_db(); - List_adp page_list = List_adp_.new_(); - wiki.Db_mgr().Load_mgr().Load_ttls_for_all_pages(this, page_list, rslt_nxt, rslt_prv, Int_obj_ref.zero_(), wiki.Ns_mgr().Ns_main(), search_ttl_bry, max_results, all_pages_min, all_pages_extend, true, false); - Xowd_page_itm[] page_ary = (Xowd_page_itm[])page_list.To_ary_and_clear(Xowd_page_itm.class); - int idx = 0, page_ary_len = page_ary.length; - for (int i = 0; i < page_ary_len; i++) { - Xowd_page_itm page = page_ary[i]; - if (page != null) { - if (!Bry_.Has_at_bgn(page.Ttl_page_db(), search_ttl_bry)) continue; // look-ahead may return other titles that don't begin with search; ignore - if (page.Text_len() > all_pages_min) { - rslts_2.Add(page); - idx++; - } - } - if (idx == max_results) break; - } - return true; - } - private boolean Search_by_search() { - Xosrh_rslt_grp rv = searcher.Itms_per_page_(max_results).Search(tmp_bfr, wiki, search_bry, 0, searcher, this); - if (canceled) {working = false; return false;} - rslts_1.Clear(); - int len = rv.Itms_len(); - for (int i = 0; i < len; i++) - rslts_1.Add(rv.Itms_get_at(i)); - if (canceled) {working = false; return false;} - rslts_1.Sort_by(Xowd_page_itm_sorter.EnyLenDsc); - if (canceled) {working = false; return false;} - if (len > max_results) len = max_results; - rslts_2.Clear(); - for (int i = 0; i < len; i++) - rslts_2.Add(rslts_1.Get_at(i)); - if (canceled) {working = false; return false;} - rslts_2.Sort_by(Xowd_page_itm_sorter.IdAsc); - wiki.Db_mgr().Load_mgr().Load_by_ids(this, rslts_2, 0, len); - rslts_2.Sort_by(Xowd_page_itm_sorter.TitleAsc); - if (canceled) {working = false; return false;} - return true; - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_search)) Search(); - else return GfoInvkAble_.Rv_unhandled; - return this; - } public static final String Invk_search = "search"; -} 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 deleted file mode 100644 index 3ac674d40..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java +++ /dev/null @@ -1,148 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.net.*; import gplx.core.threads.*; import gplx.core.envs.*; -import gplx.gfui.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.core.js.*; -import gplx.xowa.wikis.nss.*; -public class Xog_search_suggest_mgr implements GfoInvkAble { - public Xog_search_suggest_mgr(Xoa_gui_mgr gui_mgr) { - this.app = gui_mgr.App(); - this.main_win = gui_mgr.Browser_win(); - cur_cmd = new Xog_search_suggest_cmd(app, this); - } private Xoae_app app; private Xog_win_itm main_win; private Js_wtr wtr = new Js_wtr(); - private int results_max = 10; private boolean log_enabled = false; - public boolean Enabled() {return enabled;} private boolean enabled = true; - public byte Search_mode() {return search_mode;} public Xog_search_suggest_mgr Search_mode_(byte v) {search_mode = v; return this;} private byte search_mode = Tid_search_mode_all_pages_v2; - 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_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.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_.Tid__main}; - public void Cancel() { - cur_cmd.Cancel(); - long prv_time = Env_.TickCount(); - while (cur_cmd.Working()) { - if (Env_.TickCount() - prv_time > 4000) { - if (log_enabled) app.Usr_dlg().Log_many("", "", "search cancel timeout: word=~{0}", String_.new_u8(search_bry)); - cur_cmd.Working_(false); - break; - } - } - } - public void Search(Xowe_wiki wiki, byte[] search_bry, byte[] cbk_func) { - this.wiki = wiki; this.search_bry = search_bry; this.cbk_func = cbk_func; - Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_special_suggest, this, Invk_search_async).Start(); - } private Xowe_wiki wiki; private byte[] search_bry, cbk_func; - private Object thread_lock = new Object(); - private void Search_async() { - if (!enabled) return; - if (search_bry.length == 0) return; - this.Cancel(); - synchronized (thread_lock) { - if (Bry_.Eq(search_bry , last_search_bry)) { - if (log_enabled) app.Usr_dlg().Log_many("", "", "search repeated?: word=~{0}", String_.new_u8(search_bry)); - return; - } - cur_cmd.Init(wiki, search_bry, results_max, search_mode, all_pages_extend, all_pages_min); - this.last_search_bry = search_bry; - if (log_enabled) app.Usr_dlg().Log_many("", "", "search bgn: word=~{0}", String_.new_u8(search_bry)); - cur_cmd.Search(); - } - } private Xog_search_suggest_cmd cur_cmd; byte[] last_search_bry; - public void Notify() {// EX: receiveSuggestions('search_word', ['result_1', 'result_2']); - // synchronized (thread_lock) NOTE: never use synchronized here; will synchronized search; DATE:2013-09-24 - byte[] search_bry = cur_cmd.Search_bry(); - if (!Bry_.Eq(search_bry, last_search_bry)) { - if (log_enabled) app.Usr_dlg().Log_many("", "", "search does not match?: expd=~{0} actl=~{1}", String_.new_u8(last_search_bry), String_.new_u8(search_bry)); - return; // do not notify if search terms do not match - } - List_adp found = cur_cmd.Results(); - wtr.Func_init(cbk_func); - wtr.Prm_bry(search_bry); - wtr.Prm_spr(); - wtr.Ary_init(); - int len = found.Count(); - for (int i = 0; i < len; i++) { - Xowd_page_itm p = (Xowd_page_itm)found.Get_at(i); - Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(p.Ns_id()); - byte[] ttl = Xoa_ttl.Replace_unders(ns.Gen_ttl(p.Ttl_page_db())); - wtr.Ary_bry(ttl); - } - wtr.Ary_term(); - wtr.Func_term(); - if (log_enabled) app.Usr_dlg().Log_many("", "", "search end: word=~{0}", String_.new_u8(search_bry)); - main_win.Active_html_box().Html_js_eval_script(wtr.To_str_and_clear()); - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_search_async)) Search_async(); - else if (ctx.Match(k, Invk_notify)) Notify(); - else if (ctx.Match(k, Invk_enabled)) return Yn.To_str(enabled); - else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); - else if (ctx.Match(k, Invk_results_max)) return results_max; - else if (ctx.Match(k, Invk_results_max_)) results_max = m.ReadInt("v"); - else if (ctx.Match(k, Invk_search_mode)) return Search_mode_str(search_mode); - else if (ctx.Match(k, Invk_search_mode_)) search_mode = Search_mode_parse(m.ReadStr("v")); - else if (ctx.Match(k, Invk_search_mode_list)) return Options_search_mode_list; - else if (ctx.Match(k, Invk_all_pages_extend)) return all_pages_extend; - else if (ctx.Match(k, Invk_all_pages_extend_)) all_pages_extend = m.ReadInt("v"); - else if (ctx.Match(k, Invk_all_pages_min)) return all_pages_min; - else if (ctx.Match(k, Invk_all_pages_min_)) all_pages_min = m.ReadInt("v"); - else if (ctx.Match(k, Invk_auto_wildcard)) return Yn.To_str(auto_wildcard); - else if (ctx.Match(k, Invk_auto_wildcard_)) auto_wildcard = m.ReadYn("v"); - else if (ctx.Match(k, Invk_log_enabled)) return Yn.To_str(log_enabled); - else if (ctx.Match(k, Invk_log_enabled_)) log_enabled = m.ReadYn("v"); - else if (ctx.Match(k, Invk_args_default)) return args_default_str; - else if (ctx.Match(k, Invk_args_default_)) Args_default_str_(m.ReadStr("v")); - else return GfoInvkAble_.Rv_unhandled; - return this; - } - public static final String Invk_search_async = "search_async", Invk_notify = "notify", Invk_enabled = "enabled", Invk_enabled_ = "enabled_", Invk_results_max = "results_max", Invk_results_max_ = "results_max_" - , Invk_search_mode = "search_mode", Invk_search_mode_ = "search_mode_", Invk_search_mode_list = "search_mode_list" - , Invk_all_pages_extend = "all_pages_extend", Invk_all_pages_extend_ = "all_pages_extend_" - , Invk_all_pages_min = "all_pages_min", Invk_all_pages_min_ = "all_pages_min_" - , Invk_auto_wildcard = "auto_wildcard", Invk_auto_wildcard_ = "auto_wildcard_" - , Invk_log_enabled = "log_enabled", Invk_log_enabled_ = "log_enabled_" - , Invk_args_default = "args_default", Invk_args_default_ = "args_default_" - ; - private static final String Str_search_mode_search = "Search", Str_search_mode_all_pages_v1 = "AllPages", Str_search_mode_all_pages_v2 = "AllPages_(v2)"; - public static final byte Tid_search_mode_all_pages_v1 = 0, Tid_search_mode_search = 1, Tid_search_mode_all_pages_v2 = 2; - private static KeyVal[] Options_search_mode_list = KeyVal_.Ary(KeyVal_.new_(Str_search_mode_search), KeyVal_.new_(Str_search_mode_all_pages_v1), KeyVal_.new_(Str_search_mode_all_pages_v2)); - private static byte Search_mode_parse(String v) { - if (String_.Eq(v, Str_search_mode_search)) return Tid_search_mode_search; - else if (String_.Eq(v, Str_search_mode_all_pages_v1)) return Tid_search_mode_all_pages_v1; - else if (String_.Eq(v, Str_search_mode_all_pages_v2)) return Tid_search_mode_all_pages_v2; - else throw Err_.new_unhandled(v); - } - private static String Search_mode_str(byte v) { - switch (v) { - case Tid_search_mode_search: return Str_search_mode_search; - case Tid_search_mode_all_pages_v1: return Str_search_mode_all_pages_v1; - case Tid_search_mode_all_pages_v2: return Str_search_mode_all_pages_v2; - default: throw Err_.new_unhandled(v); - } - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java deleted file mode 100644 index 2ec78bcd7..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java +++ /dev/null @@ -1,98 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.data.tbls.*; -public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { - public int Pages_len() {return pages_ary.length;} - public int Itms_bgn() {return itms_bgn;} private int itms_bgn; - public int Itms_end() {return itms_end;} private int itms_end; - public int Itms_per_page() {return itms_per_page;} public Xosrh_page_mgr Itms_per_page_(int v) {itms_per_page = v; return this;} private int itms_per_page = 100; - public byte Sort_tid() {return sort_tid;} - public Xosrh_page_mgr Sort_tid_(byte v) { - if (sort_tid == v) return this; - sort_tid = v; - sorter.Tid_(v); - prv_search_bry = Bry_.Empty; // reset search - return this; - } byte sort_tid; - private byte[] prv_search_bry = Bry_.Empty, prv_ns_bry = Bry_.Empty; - public boolean Prv_search_is_same(byte[] cur_search_bry, byte[] cur_ns_bry) { - return Bry_.Eq(cur_ns_bry, prv_ns_bry) && Bry_.Eq(cur_search_bry, prv_search_bry); - } - private Xosrh_rslt_grp[] pages_ary; List_adp cur_ids = List_adp_.new_(); - private Xosrh_rslt_itm_sorter sorter = new Xosrh_rslt_itm_sorter(); - private Xowe_wiki wiki; - public Xows_ns_mgr Ns_mgr() {return ns_mgr;} public void Ns_mgr_(Xows_ns_mgr v) {ns_mgr = v;} private Xows_ns_mgr ns_mgr = new Xows_ns_mgr(); - public Xosrh_rslt_grp Search(Bry_bfr bfr, Xowe_wiki wiki, byte[] search, int page_idx, Xosrh_page_mgr_searcher searcher) {return Search(bfr, wiki, search, page_idx, searcher, Cancelable_.Never);} - public Xosrh_rslt_grp Search(Bry_bfr bfr, Xowe_wiki wiki, byte[] search, int page_idx, Xosrh_page_mgr_searcher searcher, Cancelable cancelable) { - this.wiki = wiki; - Xosrh_rslt_grp rv = null; - itms_bgn = page_idx * itms_per_page; - itms_end = itms_bgn + itms_per_page; - if (Prv_search_is_same(search, ns_mgr.To_hash_key())) { // search is same - if (page_idx < pages_ary.length) { // page_idx is in bounds - rv = pages_ary[page_idx]; - if (rv != null) return rv; // page_found; return it; - } - } - else { // search is new; rebuild; - List_adp ids = searcher.Parse_search_and_load_ids(cancelable, bfr, ns_mgr, search); - Rebuild(cancelable, wiki, ids); - prv_search_bry = search; - prv_ns_bry = ns_mgr.To_hash_key(); - } - int ids_len = cur_ids.Count(); - if (itms_end > ids_len) itms_end = ids_len; - if (page_idx < 0 || page_idx >= pages_ary.length) return Grp_empty; - if ( sort_tid != Xosrh_rslt_itm_sorter.Tid_ttl_asc - && cancelable == Cancelable_.Never // cancelable != Cancelable_.Never for search_suggest - && wiki.Db_mgr().Tid() == gplx.xowa.wikis.dbs.Xodb_mgr_txt.Tid_txt // txt only has search_title fields (page_id, word_id), so it needs to do another load to get page fields; note that sql has page fields already - ) { - wiki.Db_mgr().Load_mgr().Load_by_ids(cancelable, cur_ids, itms_bgn, itms_end); - } - rv = new Xosrh_rslt_grp(page_idx); - for (int i = itms_bgn; i < itms_end; i++) - rv.Itms_add((Xowd_page_itm)cur_ids.Get_at(i)); - pages_ary[page_idx] = rv; - rv.Itms_total_(cur_ids.Count()); - return rv; - } - public List_adp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xows_ns_mgr ns_mgr, byte[] search) { - search = wiki.Lang().Case_mgr().Case_build_lower(search, 0, search.length); - Xosrh_qry_itm cur_root = Xosrh_parser.Instance.Parse(search); - cur_root.Search(cancelable, bfr, search, wiki, itms_per_page, ns_mgr); - return cur_root.Matches(search).Ids(); - } - private void Rebuild(Cancelable cancelable, Xowe_wiki wiki, List_adp ids) { - int ids_len = ids.Count(); - int pages_len = ((ids_len - 1) / itms_per_page) + 1; if (pages_len == 0) pages_len = 1; - pages_ary = new Xosrh_rslt_grp[pages_len]; - cur_ids.Clear(); - for (int i = 0; i < ids_len; i++) - cur_ids.Add(ids.Get_at(i)); - if (sort_tid == Xosrh_rslt_itm_sorter.Tid_ttl_asc) { - cur_ids.Sort_by(sorter.Tid_(Xosrh_rslt_itm_sorter.Tid_id)); - wiki.Db_mgr().Load_mgr().Load_by_ids(cancelable, cur_ids, 0, ids_len); - cur_ids.Sort_by(sorter.Tid_(Xosrh_rslt_itm_sorter.Tid_ttl_asc)); - } - else { - cur_ids.Sort_by(sorter.Tid_(Xosrh_rslt_itm_sorter.Tid_len_dsc)); - } - } - private static final Xosrh_rslt_grp Grp_empty = new Xosrh_rslt_grp(-1); -} 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 deleted file mode 100644 index 1724b9200..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java +++ /dev/null @@ -1,87 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.core.encoders.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.wikis.nss.*; -public class Xosrh_page_mgr_tst { - @Before public void init() {fxt.Clear();} private Xosrh_page_mgr_fxt fxt = new Xosrh_page_mgr_fxt(); - @Test public void Basic() { - fxt.Init_itms_per_page_(3).Init_site_ids(10, 20); - Xosrh_page_mgr_searcher ids_a = fxt.ids_(10, 17); - fxt.Test_search("A", ids_a, 0, Int_.Ary(16, 15, 14)); - fxt.Test_search("A", ids_a, 1, Int_.Ary(13, 12, 11)); - fxt.Test_search("A", ids_a, 2, Int_.Ary(10)); - fxt.Test_search("A", ids_a, 0, Int_.Ary(16, 15, 14)); - Xosrh_page_mgr_searcher ids_b = fxt.ids_(17, 20); - fxt.Init_sort_by_name_(true).Test_search("B", ids_b, 0, Int_.Ary(17, 18, 19)); - } -} -class Xosrh_page_mgr_fxt { - public Xosrh_page_mgr_fxt Clear() { - if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); - tmp_bfr = Bry_bfr.reset_(255); - page_mgr = new Xosrh_page_mgr(); - hive_mgr = new Xowd_hive_mgr(wiki, Xotdb_dir_info_.Tid_id); - } - return this; - } private Xoae_app app; Xowe_wiki wiki; Bry_bfr tmp_bfr; Xosrh_page_mgr page_mgr; Xowd_hive_mgr hive_mgr; - public Xosrh_page_mgr_fxt Init_site_ids(int bgn, int end) { - Xowd_page_itm tmp_itm = new Xowd_page_itm(); - for (int i = bgn; i < end; i++) { - byte[] id_bry = new byte[5]; // NOTE: do not reuse; will break hive_mgr - Base85_.Set_bry(i, id_bry, 0, 5); - tmp_itm.Ns_id_(Xow_ns_.Tid__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.To_bry_and_clear(), null); - } - return this; - } - // public Xowd_page_itm Set_all(int id, int fil_idx, int row_idx, boolean type_redirect, int itm_len, int ns_id, byte[] ttl) { - public Xosrh_page_mgr_fxt Init_sort_by_name_(boolean v) {page_mgr.Sort_tid_(v ? Xosrh_rslt_itm_sorter.Tid_ttl_asc : Xosrh_rslt_itm_sorter.Tid_len_dsc); return this;} - public Xosrh_page_mgr_fxt Init_itms_per_page_(int v) {page_mgr.Itms_per_page_(v); return this;} - public Xosrh_page_mgr_searcher_mok ids_(int bgn, int end) { - List_adp rv = List_adp_.new_(); - int len = end - bgn; - for (int i = 0; i < len; i++) { - int itm_id = i + bgn; - int itm_len = itm_id; - Xowd_page_itm itm = Xowd_page_itm.new_srch(itm_id, itm_len); - rv.Add(itm); - } - return new Xosrh_page_mgr_searcher_mok(rv); - } - public void Test_search(String search_str, Xosrh_page_mgr_searcher searcher, int page_idx, int[] expd) { - byte[] search_bry = Bry_.new_a7(search_str); - Xosrh_rslt_grp page = page_mgr.Search(tmp_bfr, wiki, search_bry, page_idx, searcher); - Tfds.Eq_ary(expd, Xto_int_ary(page)); - } - int[] Xto_int_ary(Xosrh_rslt_grp page) { - int len = page.Itms_len(); - int[] rv = new int[len]; - for (int i = 0; i < len; i++) { - rv[i] = ((Xowd_page_itm)page.Itms_get_at(i)).Id(); - } - return rv; - } -} -class Xosrh_page_mgr_searcher_mok implements Xosrh_page_mgr_searcher { - public Xosrh_page_mgr_searcher_mok(List_adp list) {this.list = list;} List_adp list; - public List_adp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xows_ns_mgr ns_mgr, byte[] search) {return list;} -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser.java deleted file mode 100644 index d29c256f2..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser.java +++ /dev/null @@ -1,88 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -class Xosrh_parser { - public Xosrh_qry_itm Parse(byte[] src) { - this.src = src; - Xosrh_qry_tkn[] tkns = Xosrh_scanner.Instance.Scan(src); - return Parse_itm_or(make_ctx.Init(tkns)); - } private Xosrh_parser_ctx make_ctx = new Xosrh_parser_ctx(); byte[] src; - Xosrh_qry_itm Parse_itm_or(Xosrh_parser_ctx make_ctx) { - Xosrh_qry_itm lhs = Parse_itm_and(make_ctx); - while (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_or)) { - make_ctx.Move_next(); - Xosrh_qry_itm rhs = Parse_itm_and(make_ctx); - lhs = Xosrh_qry_itm.nde_(Xosrh_qry_itm.Tid_or, lhs, rhs); - } - return lhs; - } - Xosrh_qry_itm Parse_itm_and(Xosrh_parser_ctx make_ctx) { - Xosrh_qry_itm lhs = Parse_itm_not(make_ctx); - while (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_and)) { - make_ctx.Move_next(); - Xosrh_qry_itm rhs = Parse_itm_not(make_ctx); - lhs = Xosrh_qry_itm.nde_(Xosrh_qry_itm.Tid_and, lhs, rhs); - } - return lhs; - } - Xosrh_qry_itm Parse_itm_not(Xosrh_parser_ctx make_ctx) { - Xosrh_qry_itm lhs = Parse_itm_leaf(make_ctx); - while (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_not)) { - make_ctx.Move_next(); - Xosrh_qry_itm rhs = Parse_itm_leaf(make_ctx); - lhs = Xosrh_qry_itm.nde_(Xosrh_qry_itm.Tid_not, null, rhs); - } - return lhs; - } - Xosrh_qry_itm Parse_itm_leaf(Xosrh_parser_ctx make_ctx) { - if (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_paren_bgn)) { - make_ctx.Move_next(); - Xosrh_qry_itm lhs = Parse_itm_or(make_ctx); - if (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_paren_end)) make_ctx.Move_next(); // skip token - return lhs; - } - else if (make_ctx.Cur_tid(Xosrh_qry_tkn.Tid_eos)) - return Xosrh_qry_itm.Null; - else { - Xosrh_qry_tkn word_tkn = make_ctx.Move_next(); - if (word_tkn.Tid() == Xosrh_qry_tkn.Tid_not) { - word_tkn = make_ctx.Move_next(); - if (word_tkn == null) return Xosrh_qry_itm.Null; // occurs in "a -" - Xosrh_qry_itm word_itm = Xosrh_qry_itm.word_(src, word_tkn); - return Xosrh_qry_itm.nde_(Xosrh_qry_itm.Tid_not, null, word_itm); - } - else - return Xosrh_qry_itm.word_(src, word_tkn); - } - } - public static final Xosrh_parser Instance = new Xosrh_parser(); Xosrh_parser() {} -} -class Xosrh_parser_ctx { - public Xosrh_parser_ctx Init(Xosrh_qry_tkn[] ary) { - this.ary = ary; - ary_len = ary.length; - this.pos = 0; - return this; - } private Xosrh_qry_tkn[] ary; int pos = 0; int ary_len; - public boolean Cur_tid(byte tid) {return pos < ary_len ? tid == ary[pos].Tid(): tid == Xosrh_qry_tkn.Tid_eos;} - public Xosrh_qry_tkn Move_next() { - Xosrh_qry_tkn rv = null; - if (pos < ary_len) rv = ary[pos++]; - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java deleted file mode 100644 index 87c89d9ff..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java +++ /dev/null @@ -1,168 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; import gplx.xowa.wikis.data.tbls.*; -public class Xosrh_parser_tst { - @Before public void init() {fxt.Clear();} private Xosearch_parser_fxt fxt = new Xosearch_parser_fxt(); - @Test public void Scan_word() {fxt.Test_scan("abc", "abc");} - @Test public void Scan_word_many() {fxt.Test_scan("abc d ef", "abc", "AND", "d", "AND", "ef");} - @Test public void Scan_word_symbol() {fxt.Test_scan("a, b", "a", "AND", "b");} - @Test public void Scan_and_embedded() {fxt.Test_scan("candy", "candy");} // check that andy does not become "AND" + y - @Test public void Scan_and_and() {fxt.Test_scan("a andand", "a", "AND", "andand");} // check that andand is word; note that AND is automatically inserted between consecutive words - @Test public void Scan_and_parentheses() {fxt.Test_scan("a and(b)", "a", "and", "(", "b", ")");} // check that ( causes and to be treated as separate word - @Test public void Scan_not() {fxt.Test_scan("-abc", "-", "abc");} - @Test public void Scan_not_and() {fxt.Test_scan("a -bc", "a", "AND", "-", "bc");} // auto-add AND for - - @Test public void Scan_space() {fxt.Test_scan(" a b ", "a", "AND", "b");} // spaces should not generate tkns - @Test public void Scan_quote() {fxt.Test_scan("\"abc\"", "abc");} - @Test public void Scan_complicated() {fxt.Test_scan("(a AND \"b\") OR -c", "(", "a","AND", "b", ")", "OR", "-", "c");} - @Test public void Scan_not_embedded() { - fxt.Test_scan ("a-b", "a-b"); // fail if "a", "NOT", "b" - fxt.Test_scan_tids ("a-b", Xosrh_qry_tkn.Tid_word_quoted); // symbols in unquoted word should convert word to quotes; EX: a-b -> "a-b" - } - @Test public void Parse_basic() {fxt.Test_parse("abc", "abc");} - @Test public void Parse_and() {fxt.Test_parse("abc AND def", "(abc AND def)");} - @Test public void Parse_not() {fxt.Test_parse("-abc", "NOT abc");} - @Test public void Parse_many() {fxt.Test_parse("A AND B OR C AND D", "((A AND B) OR (C AND D))");} - @Test public void Match() { - fxt.Init_match("A", 11, 12, 22); - fxt.Init_match("B", 21, 22, 12); - fxt.Test_match("A OR B" , 11, 12, 22, 21); - fxt.Test_match("A AND B" , 22, 12); - fxt.Test_match("A AND -B" , 11); - } - @Test public void Search() { - Xosearch_searcher_fxt fxt = new Xosearch_searcher_fxt().Clear(); - fxt.Init_search("a1", 11, 12); - fxt.Init_search("b1", 21, 22); - fxt.Init_search("b2", 26, 27); - fxt.Init_search("c1", 31, 12); - fxt.Test_search("b1", 21, 22); - fxt.Test_search("b*", 21, 22, 26, 27); - } -} -class Xosearch_searcher_fxt { - public Xosearch_searcher_fxt Clear() { - if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); - mgr = new Xowd_hive_mgr(wiki, Xotdb_dir_info_.Tid_search_ttl); - tmp_bfr = Bry_bfr.reset_(255); - parser = Xosrh_parser.Instance; - } - return this; - } - Xoae_app app; Xowe_wiki wiki; Xowd_hive_mgr mgr; Bry_bfr tmp_bfr; - Xosrh_parser parser; - public void Init_search(String ttl_str, int... ids) { - byte[] ttl_bry = Bry_.new_a7(ttl_str); - tmp_bfr.Add(ttl_bry); - int len = ids.length; - for (int i = 0; i < len; i++) { - int id = ids[i]; - tmp_bfr.Add_byte_pipe(); - tmp_bfr.Add_base85_len_5(id); - tmp_bfr.Add_byte(Byte_ascii.Semic); - tmp_bfr.Add_base85_len_5(0); - } - mgr.Create(wiki.Ns_mgr().Ns_main(), ttl_bry, tmp_bfr.To_bry_and_clear(), null); - } - public void Test_search(String ttl_str, int... expd) { - byte[] ttl_bry = Bry_.new_a7(ttl_str); - Xosrh_qry_itm qry_root = parser.Parse(ttl_bry); - Xows_ns_mgr ns_mgr = new Xows_ns_mgr(); ns_mgr.Add_all(); // WORKAROUND: xdat fmt does not store ns with search data; pages will be retrieved with ns_id = null; force ns_all (instead of allowing ns_main default); - qry_root.Search(Cancelable_.Never, tmp_bfr, ttl_bry, wiki, 100, ns_mgr); - int[] actl = Xosearch_parser_fxt.Xto_ints(qry_root.Ids()); - Tfds.Eq_ary(expd, actl); - } -} -class Xosearch_parser_fxt { - public Xosearch_parser_fxt Clear() { - if (parser == null) { - parser = Xosrh_parser.Instance; - matches = Ordered_hash_.New_bry(); - } - matches.Clear(); - return this; - } private Xosrh_parser parser; Ordered_hash matches; - public void Init_match(String name, int... ids) { - int len = ids.length; - List_adp id_vals = List_adp_.new_(); - for (int i = 0; i < len; i++) - id_vals.Add(Xowd_page_itm.new_srch(ids[i], 0)); - matches.Add(Bry_.new_a7(name), id_vals); - } - public void Test_match(String raw, int... expd) { - byte[] src = Bry_.new_a7(raw); - Xosrh_qry_itm qry_root = parser.Parse(src); - Test_match_assign_ids(src, qry_root); - Xosrh_qry_ids matches = qry_root.Matches(src); - Tfds.Eq_ary(expd, Xto_ints(matches.Ids())); - } - public static int[] Xto_ints(List_adp list) { - if (list == null) return Int_.Ary_empty; - int len = list.Count(); - int[] rv = new int[len]; - for (int i = 0; i < len; i++) - rv[i] = ((Xowd_page_itm)list.Get_at(i)).Id(); - return rv; - } - private void Test_match_assign_ids(byte[] src, Xosrh_qry_itm itm) { - if (itm.Tid() == Xosrh_qry_itm.Tid_word) { - byte[] word = itm.Word(); - List_adp ids = (List_adp)matches.Get_by(word); - itm.Ids_(ids); - } - else { - if (itm.Lhs() != null) Test_match_assign_ids(src, itm.Lhs()); - if (itm.Rhs() != null) Test_match_assign_ids(src, itm.Rhs()); - } - } - public void Test_scan(String raw, String... expd) { - byte[] src = Bry_.new_a7(raw); - Xosrh_qry_tkn[] actl_itms = Xosrh_scanner.Instance.Scan(src); - Tfds.Eq_ary(expd, To_strings(src, actl_itms)); - } - public void Test_scan_tids(String raw, byte... expd) { - byte[] src = Bry_.new_a7(raw); - Xosrh_qry_tkn[] actl_itms = Xosrh_scanner.Instance.Scan(src); - Tfds.Eq_ary(expd, To_tids(actl_itms)); - } - String[] To_strings(byte[] src, Xosrh_qry_tkn[] ary) { - int len = ary.length; - String[] rv = new String[len]; - for (int i = 0; i < len; i++) { - Xosrh_qry_tkn tkn = ary[i]; - rv[i] = String_.new_a7(tkn.Val(src)); - } - return rv; - } - byte[] To_tids(Xosrh_qry_tkn[] ary) { - int len = ary.length; - byte[] rv = new byte[len]; - for (int i = 0; i < len; i++) { - Xosrh_qry_tkn tkn = ary[i]; - rv[i] = tkn.Tid(); - } - return rv; - } - public void Test_parse(String raw, String expd) { - byte[] src = Bry_.new_a7(raw); - Xosrh_qry_itm qry_root = parser.Parse(src); - Tfds.Eq(expd, qry_root.Xto_str(src)); - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java deleted file mode 100644 index 7d0504f12..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java +++ /dev/null @@ -1,219 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.texts.*; -class Xosrh_qry_itm { - public Xosrh_qry_itm(byte tid, byte[] word, Xosrh_qry_itm lhs, Xosrh_qry_itm rhs) { - this.tid = tid; this.word = word; this.lhs = lhs; this.rhs = rhs; - } - public byte Tid() {return tid;} private byte tid; - public Xosrh_qry_itm Lhs() {return lhs;} private Xosrh_qry_itm lhs; - public Xosrh_qry_itm Rhs() {return rhs;} private Xosrh_qry_itm rhs; - public List_adp Ids() {return ids;} public void Ids_(List_adp v) {this.ids = v;} List_adp ids = List_adp_.Noop; - public byte[] Word() {return word;} private byte[] word; - public String Xto_str(byte[] src) { - Bry_bfr bfr = Bry_bfr.new_(); - Xto_str_bld(src, bfr); - return bfr.To_str_and_clear(); - } - public Xosrh_qry_ids Matches(byte[] src) { - switch (tid) { - case Xosrh_qry_itm.Tid_word: - case Xosrh_qry_itm.Tid_word_quote: - return new Xosrh_qry_ids(false, ids); - case Xosrh_qry_itm.Tid_not: Xosrh_qry_ids rv = rhs.Matches(src); return rv.Not_(!rv.Not()); - case Xosrh_qry_itm.Tid_or: - case Xosrh_qry_itm.Tid_and: - List_adp merged = Evaluate(src, tid == Xosrh_qry_itm.Tid_and, lhs, rhs); - return new Xosrh_qry_ids(false, merged); - case Xosrh_qry_itm.Tid_null: return Xosrh_qry_ids.Null; - default: throw Err_.new_unhandled(tid); - } - } - private static List_adp Search_word(Xowe_wiki wiki, Cancelable cancelable, Bry_bfr tmp_bfr, Xows_ns_mgr ns_mgr, byte[] search_word, int results_max) { - List_adp found = List_adp_.new_(); - byte wiki_db_tid = wiki.Db_mgr().Tid(); - if (wiki_db_tid == Xodb_mgr_sql.Tid_sql - && wiki.Appe().Gui_mgr().Search_suggest_mgr().Auto_wildcard()) { // HACK: auto-asterisk words for sqlite; DATE:2013-09-05 - if (!Bry_.Has_at_end(search_word, new byte[] {Byte_ascii.Star})) - search_word = Bry_.Add(search_word, Byte_ascii.Star); - if (!Bry_.Has_at_bgn(search_word, new byte[] {Byte_ascii.Star})) - search_word = Bry_.Add(Byte_ascii.Star, search_word); - } - wiki.Db_mgr().Load_mgr().Load_search(cancelable, found, search_word, results_max); - List_adp rv = List_adp_.new_(); - int found_len = found.Count(); - for (int i = 0; i < found_len; i++) { - Xowd_page_itm page = (Xowd_page_itm)found.Get_at(i); - if ( ns_mgr.Has(page.Ns_id()) - || wiki_db_tid == Xodb_mgr_txt.Tid_txt) // xdat does not store ns, so ns will always be null; no choice but to bring back all results; DATE:2013-11-14 - rv.Add(page); - } - return rv; - } - public void Search(Cancelable cancelable, Bry_bfr tmp_bfr, byte[] src, Xowe_wiki wiki, int results_max, Xows_ns_mgr ns_mgr) { - if (cancelable.Canceled()) return; - switch (tid) { - case Xosrh_qry_itm.Tid_null: return; - case Xosrh_qry_itm.Tid_word: - ids = Search_word(wiki, cancelable, tmp_bfr, ns_mgr, word, results_max); - break; - case Xosrh_qry_itm.Tid_word_quote: - Ordered_hash tmp_search_list = Ordered_hash_.New(); - byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split_ttl_into_words(wiki.Lang(), tmp_search_list, tmp_bfr, word); - int words_len = words.length; - List_adp prv_list = null; - for (int i = 0; i < words_len; i++) { - if (cancelable.Canceled()) return; - List_adp cur_list = Search_word(wiki, cancelable, tmp_bfr, ns_mgr, words[i], results_max); - if (prv_list == null) // 1st list; just set to cur_list - prv_list = cur_list; - else { // nth list; AND to prv_list; "A B" should find all titles with "A AND B" - prv_list = Evaluate(word, true, prv_list, false, cur_list, false); - } - } - List_adp tmp_ids = prv_list; - int ids_len = tmp_ids.Count(); - if (ids_len == 0) return; - if (cancelable.Canceled()) return; - wiki.Db_mgr().Load_mgr().Load_by_ids(cancelable, tmp_ids, 0, ids_len); - if (cancelable.Canceled()) return; - ids = List_adp_.new_(); - for (int i = 0; i < ids_len; i++) { - Xowd_page_itm itm = (Xowd_page_itm)tmp_ids.Get_at(i); - byte[] itm_ttl = itm.Ttl_page_db(); - itm_ttl = wiki.Lang().Case_mgr().Case_build_lower(itm_ttl, 0, itm_ttl.length); // lowercase ttl (since all search words are lower-cased) - itm_ttl = Bry_.Replace(itm_ttl, Byte_ascii.Underline, Byte_ascii.Space); // replace _ with " " (assume user will use spaces in search term) - if (Bry_find_.Find_fwd(itm_ttl, word) != Bry_find_.Not_found) - ids.Add(itm); - } - break; - default: - if (lhs != null) lhs.Search(cancelable, tmp_bfr, src, wiki, results_max, ns_mgr); - if (rhs != null) rhs.Search(cancelable, tmp_bfr, src, wiki, results_max, ns_mgr); - break; - } - } - static final byte Evaluate_tid_null = 0, Evaluate_tid_and = 1, Evaluate_tid_or = 2, Evaluate_tid_not_and = 3; - List_adp Evaluate(byte[] src, boolean join_tid_is_and, Xosrh_qry_itm lhs, Xosrh_qry_itm rhs) { - Xosrh_qry_ids lhs_grp = lhs.Matches(src), rhs_grp = rhs.Matches(src); - boolean lhs_not = lhs_grp.Not(), rhs_not = rhs_grp.Not(); - List_adp lhs_list = lhs_grp.Ids(), rhs_list = rhs_grp.Ids(); - if (lhs_not && rhs_not) return Evaluate_not_found("NOT cannot be applied to both lists: lhs:~{0} rhs:~{1}", lhs.Xto_str(src), rhs.Xto_str(src)); - return Evaluate(src, join_tid_is_and, lhs_list, lhs_not, rhs_list, rhs_not); - } - /* - AND,0 nots: hash a; iterate cur_b and add if in a - OR ,0 nots; hash a; add a; iterate cur_b and add if not in a - AND,1 nots; hash notted; iterate comp and add only if not in notted; (a,cur_b,c) AND NOT (cur_b) - AND,2 nots; fail; NOT xq AND NOT qx will yield all titles - OR ,2 nots; fail; NOT xq OR NOT qx will yield all titles - OR ,1 nots; fail; (a, cur_b, c, d) OR NOT (xq) will yield all titles - */ - List_adp Evaluate(byte[] src, boolean join_tid_is_and, List_adp lhs_list, boolean lhs_not, List_adp rhs_list, boolean rhs_not) { - List_adp list_to_hash = null, list_to_comp = null; int len = 0; - byte tid = Evaluate_tid_null; - List_adp rv = List_adp_.new_(); - if (lhs_not || rhs_not) { - if (!join_tid_is_and) - return Evaluate_not_found("NOT cannot be applied with OR: lhs:~{0} rhs:~{1}", lhs.Xto_str(src), rhs.Xto_str(src)); - if (lhs_not) { - list_to_hash = lhs_list; - list_to_comp = rhs_list; - } - else { - list_to_hash = rhs_list; - list_to_comp = lhs_list; - } - tid = Evaluate_tid_not_and; - } - else { - tid = join_tid_is_and ? Evaluate_tid_and : Evaluate_tid_or; - boolean rhs_is_smaller = rhs_list.Count() < lhs_list.Count(); - if (rhs_is_smaller) { - list_to_hash = rhs_list; - list_to_comp = lhs_list; - } - else { - list_to_hash = lhs_list; - list_to_comp = rhs_list; - } - } - len = list_to_hash.Count(); - for (int i = 0; i < len; i++) { - Xowd_page_itm id = (Xowd_page_itm)list_to_hash.Get_at(i); - try { - if (!tmp_hash.Has(id.Id_val())) tmp_hash.Add(id.Id_val(), id); - } catch (Exception e) {Err_.Noop(e); tmp_hash.Clear(); return List_adp_.Noop;} // handle error in case of threading issues; must clear tmp_hash else will accumulate; - if (tid == Evaluate_tid_or) - rv.Add(id); - } - len = list_to_comp.Count(); - for (int i = 0; i < len; i++) { - Xowd_page_itm id = (Xowd_page_itm)list_to_comp.Get_at(i); - boolean exists = tmp_hash.Has(id.Id_val()); - switch (tid) { - case Evaluate_tid_and: // iterate comp and add if in a; EX: (a,cur_b,c) AND (a,d); add a - if (exists) rv.Add(id); - break; - case Evaluate_tid_or: // iterate comp and add if not in a; EX: (a,cur_b,c) OR (a,d); add d - case Evaluate_tid_not_and: // iterate comp and add only if not in notted; (a,cur_b,c) AND NOT (cur_b); add a, c - if (!exists) - rv.Add(id); - break; - case Evaluate_tid_null: default: - throw Err_.new_unhandled(tid); - } - } - tmp_hash.Clear(); - return rv; - } static Ordered_hash tmp_hash = Ordered_hash_.New(); - List_adp Evaluate_not_found(String msg, Object... args) { - return null; - } - public void Xto_str_bld(byte[] src, Bry_bfr bfr) { - switch (tid) { - case Xosrh_qry_itm.Tid_word: bfr.Add(word); break; - case Xosrh_qry_itm.Tid_not: bfr.Add(Bry_not); rhs.Xto_str_bld(src, bfr); break; - case Xosrh_qry_itm.Tid_or: - case Xosrh_qry_itm.Tid_and: - bfr.Add_byte(Byte_ascii.Paren_bgn); - lhs.Xto_str_bld(src, bfr); - bfr.Add(tid == Xosrh_qry_itm.Tid_or ? Bry_or : Bry_and); - rhs.Xto_str_bld(src, bfr); - bfr.Add_byte(Byte_ascii.Paren_end); - break; - case Xosrh_qry_itm.Tid_null: break; - default: throw Err_.new_unhandled(tid); - } - } - public static final byte Tid_null = 0, Tid_root = 1, Tid_word = 2, Tid_word_quote = 3, Tid_not = 4, Tid_or = 5, Tid_and = 6; - public static byte[] Bry_not = Bry_.new_a7("NOT "), Bry_and = Bry_.new_a7(" AND "), Bry_or = Bry_.new_a7(" OR "); - public static final Xosrh_qry_itm Null = new Xosrh_qry_itm(Tid_null, null, null, null); - public static Xosrh_qry_itm nde_(byte tid, Xosrh_qry_itm lhs, Xosrh_qry_itm rhs) {return new Xosrh_qry_itm(tid, null, lhs, rhs);} - public static Xosrh_qry_itm word_(byte[] src, Xosrh_qry_tkn word_tkn) { - byte tid = word_tkn.Tid() == Xosrh_qry_tkn.Tid_word ? Xosrh_qry_itm.Tid_word : Xosrh_qry_itm.Tid_word_quote; - return new Xosrh_qry_itm(tid, word_tkn.Val(src), null, null); - } -} -class Xosrh_qry_ids { - public Xosrh_qry_ids(boolean not, List_adp ids) {this.not = not; this.ids = ids;} - public boolean Not() {return not;} public Xosrh_qry_ids Not_(boolean v) {not = v; return this;} private boolean not; - public List_adp Ids() {return ids;} public Xosrh_qry_ids Ids_(List_adp v) {ids = v; return this;} List_adp ids = List_adp_.Noop; - public static final Xosrh_qry_ids Null = new Xosrh_qry_ids(false, List_adp_.Noop); -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java deleted file mode 100644 index 441a62884..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java +++ /dev/null @@ -1,44 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.data.tbls.*; -public class Xosrh_rslt_grp { - public Xosrh_rslt_grp(int idx) {this.idx = idx;} private Xowd_page_itm[] itms = Xowd_page_itm.Ary_empty; - public int Idx() {return idx;} private int idx; - public int Itms_len() {return itms_len;} private int itms_len; int itms_max; - public int Itms_total() {return itms_total;} public Xosrh_rslt_grp Itms_total_(int v) {itms_total = v; return this;} private int itms_total; - public Xowd_page_itm Itms_get_at(int i) {return itms[i];} - public void Itms_add(Xowd_page_itm itm) { - int new_itms_len = itms_len + 1; - if (new_itms_len > itms_max) { - itms_max = itms_max == 0 ? 2 : itms_max * 2; - itms = (Xowd_page_itm[])Array_.Resize(itms, itms_max); - } - itms[itms_len] = itm; - itms_len = new_itms_len; - } - public boolean Itms_full() {return itms_len >= itms_max;} - public void Itms_clear() { - for (int i = 0; i < itms_len; i++) - itms[i] = null; - itms = Xowd_page_itm.Ary_empty; - itms_len = itms_max = 0; - } - public void Itms_sort(Xowd_page_itm_sorter sorter) {Array_.Sort(itms, sorter);} - public static final Xosrh_rslt_grp[] Ary_empty = new Xosrh_rslt_grp[0]; -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java deleted file mode 100644 index 1bccd5296..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java +++ /dev/null @@ -1,52 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.data.tbls.*; -public class Xosrh_rslt_itm_sorter implements gplx.core.lists.ComparerAble { - public byte Tid() {return tid;} public Xosrh_rslt_itm_sorter Tid_(byte v) {tid = v; return this;} private byte tid = Tid_len_dsc; - public int compare(Object lhsObj, Object rhsObj) { - Xowd_page_itm lhs = (Xowd_page_itm)lhsObj; - Xowd_page_itm rhs = (Xowd_page_itm)rhsObj; - if (lhs == null || rhs == null || tid == Tid_none) return CompareAble_.Same; -// else if (lhs == null) return CompareAble_.Less; -// else if (rhs == null) return CompareAble_.More; - else { - switch (tid) { - case Tid_len_dsc: return Int_.Compare(lhs.Text_len(), rhs.Text_len()) * -1; - case Tid_ttl_asc: return Bry_.Compare(lhs.Ttl_page_db(), rhs.Ttl_page_db()); - case Tid_id: return Int_.Compare(lhs.Id(), rhs.Id()); - default: throw Err_.new_unhandled(tid); - } - } - } - public static final byte Tid_none = 0, Tid_len_dsc = 1, Tid_ttl_asc = 2, Tid_id = 3; - public static byte parse(String v) { - if (String_.Eq(v, "none")) return Tid_none; - else if (String_.Eq(v, "len_desc")) return Tid_len_dsc; - else if (String_.Eq(v, "title_asc")) return Tid_ttl_asc; - else throw Err_.new_unhandled(v); - } - public static String Xto_url_arg(byte v) { - switch (v) { - case Tid_none: return ""; - case Tid_len_dsc: return "&xowa_sort=len_desc"; - case Tid_ttl_asc: return "&xowa_sort=title_asc"; - default: throw Err_.new_unhandled(v); - } - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java deleted file mode 100644 index d43d00205..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java +++ /dev/null @@ -1,153 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; import gplx.core.btries.*; -class Xosrh_scanner { - List_adp tkns = List_adp_.new_(); byte[] src; int src_len; int pos; int txt_bgn; - public Xosrh_qry_tkn[] Scan(byte[] src) { - this.src = src; this.src_len = src.length; - tkns.Clear(); pos = 0; txt_bgn = -1; - while (pos < src_len) { - byte cur_b = src[pos]; - Object cur_obj = trie.Match_bgn_w_byte(cur_b, src, pos, src_len); - if (cur_obj == null) { // text character - if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it - ++pos; - } - else { // AND, OR, (, ), -, \s, " - int pos_end = trie.Match_pos(); - byte cur_tid = ((Byte_obj_val)cur_obj).Val(); - if (Cur_join_is_word(cur_tid, pos_end)) continue; - if (txt_bgn != -1) { // pending word; create - Tkns_add_word(Xosrh_qry_tkn.Tid_word, txt_bgn, pos); - txt_bgn = -1; - } - switch (cur_tid) { - case Xosrh_qry_tkn.Tid_space: // discard spaces - pos = Bry_find_.Find_fwd_while(src, pos, src_len, Byte_ascii.Space); - break; - case Xosrh_qry_tkn.Tid_quote: // find end quote and add as word - int quote_bgn = pos + 1; - int quote_end = Bry_find_.Find_fwd(src, Byte_ascii.Quote, quote_bgn, src_len); - if (quote_end == Bry_find_.Not_found) throw Err_.new_wo_type("could not find end quote", "src", String_.new_u8(src)); - Tkns_add_word(Xosrh_qry_tkn.Tid_word_quoted, quote_bgn, quote_end); - pos = quote_end + 1; // +1 to place after quote - break; - case Xosrh_qry_tkn.Tid_not: - Tkns_add_word(Xosrh_qry_tkn.Tid_not, pos, pos_end); - pos = pos_end; - break; - case Xosrh_qry_tkn.Tid_paren_bgn: case Xosrh_qry_tkn.Tid_paren_end: - case Xosrh_qry_tkn.Tid_and: case Xosrh_qry_tkn.Tid_or: - tkns.Add(new_tkn_(cur_tid, pos, pos_end)); - pos = pos_end; - break; - default: throw Err_.new_unhandled(cur_tid); - } - } - } - if (txt_bgn != -1) { // pending word; create - Tkns_add_word(Xosrh_qry_tkn.Tid_word, txt_bgn, pos); - txt_bgn = -1; - } - return (Xosrh_qry_tkn[])tkns.To_ary_and_clear(Xosrh_qry_tkn.class); - } - boolean Cur_join_is_word(byte cur_tid, int pos_end) { // extra logic to handle and / or occuring in unquoted strings; EX: random; for - switch (cur_tid) { - default: return false; // only look at AND, OR, - - case Xosrh_qry_tkn.Tid_and: case Xosrh_qry_tkn.Tid_or: case Xosrh_qry_tkn.Tid_not: - break; - } - boolean join_is_word = true; - if (txt_bgn == -1) { // no pending word; - if (cur_tid == Xosrh_qry_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b - byte nxt_b = pos_end < src_len ? src[pos_end] : Byte_ascii.Null; - Object nxt_obj = trie.Match_bgn_w_byte(nxt_b, src, pos_end, src_len); - if (nxt_obj == null) // next tkn is text; join must be word - join_is_word = true; - else { // next tkn is tkn - byte nxt_tid = ((Byte_obj_val)nxt_obj).Val(); - switch (nxt_tid) { - case Xosrh_qry_tkn.Tid_space: case Xosrh_qry_tkn.Tid_quote: - case Xosrh_qry_tkn.Tid_paren_bgn: case Xosrh_qry_tkn.Tid_paren_end: - join_is_word = false; // next tkn is sym; and/or is not word; EX: a AND ; a AND"b"; a AND(b) - break; - case Xosrh_qry_tkn.Tid_not: case Xosrh_qry_tkn.Tid_and: case Xosrh_qry_tkn.Tid_or: - join_is_word = true; // next tkn is and or not; and/or is word; EX: andor; oror; or-abc; - break; - default: throw Err_.new_unhandled(cur_tid); - } - } - } - else { // pending word; cur join must be word; EX: "grand": "and" invoked and "gr" pending - join_is_word = true; - } - if (join_is_word) { - if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it - pos = pos_end; - return true; - } - if (txt_bgn != -1) { - Tkns_add_word(Xosrh_qry_tkn.Tid_word, txt_bgn, pos); // create word - txt_bgn = -1; - } - return false; - } - private void Tkns_add_word(byte tid, int src_bgn, int src_end) { - if (tkns.Count() > 0) { // at least 1 tkn - Xosrh_qry_tkn last_tkn = (Xosrh_qry_tkn)tkns.Get_at_last(); - if (last_tkn.Tid() == Xosrh_qry_tkn.Tid_word) // previous tkn is not word; auto "AND" words; EX: A B -> A AND B - tkns.Add(Xosrh_qry_tkn.new_bry_(Xosrh_qry_tkn.Tid_and, Bry_and)); - } - if (tid == Xosrh_qry_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b - byte[] cur_word = Bry_.Mid(src, src_bgn, src_end); - byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split_ttl_into_words(null, tmp_list, tmp_bfr, cur_word); - int words_len = words.length; - if (words_len == 1 && !Bry_.Eq(words[0], cur_word) && Bry_find_.Find_fwd(cur_word, Byte_ascii.Star) == -1) { - tkns.Add(Xosrh_qry_tkn.new_bry_(tid, words[0])); - return; - } - if (words.length > 1) - tid = Xosrh_qry_tkn.Tid_word_quoted; - } - tkns.Add(new_tkn_(tid, src_bgn, src_end)); - } - 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_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) - .Add_str_byte("(", Xosrh_qry_tkn.Tid_paren_bgn) - .Add_str_byte(")", Xosrh_qry_tkn.Tid_paren_end) - .Add_str_byte("or", Xosrh_qry_tkn.Tid_or) - .Add_str_byte("and", Xosrh_qry_tkn.Tid_and); - public static final Xosrh_scanner Instance = new Xosrh_scanner(); Xosrh_scanner() {} -} -class Xosrh_qry_tkn { - Xosrh_qry_tkn(byte tid, int val_bgn, int val_end, byte[] val_bry) {this.tid = tid; this.val_bgn = val_bgn; this.val_end = val_end; this.val_bry = val_bry;} - public byte Tid() {return tid;} private byte tid; - int val_bgn = -1; - int val_end = -1; - byte[] val_bry; - public byte[] Val(byte[] src) {return val_bry == null ? Bry_.Mid(src, val_bgn, val_end) : val_bry;} - public static Xosrh_qry_tkn new_pos_(byte tid, int val_bgn, int val_end) {return new Xosrh_qry_tkn(tid, val_bgn, val_end, null);} - public static Xosrh_qry_tkn new_bry_(byte tid, byte[] val_bry) {return new Xosrh_qry_tkn(tid, -1, -1, val_bry);} - public static final byte Tid_root = 1, Tid_word = 2, Tid_word_quoted = 3, Tid_space = 4, Tid_quote = 5, Tid_not = 6, Tid_paren_bgn = 7, Tid_paren_end = 8, Tid_or = 9, Tid_and = 10, Tid_eos = 11; -} 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 deleted file mode 100644 index 30915afe4..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_arg_mgr.java +++ /dev/null @@ -1,74 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -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(); - public byte[] Search_bry() {return search_bry;} private byte[] search_bry; - public int Paging_idx() {return paging_idx;} private int paging_idx; - public byte Sort_tid() {return sort_tid;} private byte sort_tid; - public byte[] Cancel() {return cancel;} private byte[] cancel; - public Xows_paging_itm[] Paging_itms() {return paging_itms;} private Xows_paging_itm[] paging_itms; - public Xows_arg_mgr Search_bry_(byte[] v) {search_bry = v; return this;} - public Xows_arg_mgr Clear() { - ns_mgr.Clear(); - this.search_bry = null; - this.paging_idx = 0; - this.sort_tid = Xosrh_rslt_itm_sorter.Tid_none; - this.cancel = null; - return this; - } - 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_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_.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; - default: break; - } - } - else { - if (Bry_.Has_at_bgn(key, Ns_bry)) // check for ns*; EX: &ns0=1&ns8=1; NOTE: lowercase only - ns_mgr.Add_by_parse(key, arg.Val_bry()); - } - } - ns_mgr.Add_main_if_empty(); - } - private static final byte Arg_search = 0, Arg_page_idx = 1, Arg_sort = 2, Arg_cancel = 3, Arg_paging = 4; - private static byte[] Ns_bry = Bry_.new_a7("ns"); - public static final byte[] - 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_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) - .Add_str_byte("search", Arg_search) - .Add_bry_byte(Arg_bry_cancel, Arg_cancel) - ; -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_core.java b/400_xowa/src/gplx/xowa/specials/search/Xows_core.java deleted file mode 100644 index 18cc50fa5..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_core.java +++ /dev/null @@ -1,87 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.dbs.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; 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(); - 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 Srch_rslt_hash Get_cache_or_new(byte[] key) { - Srch_rslt_hash cache = (Srch_rslt_hash)cache_hash.Get_by_bry(key); - if (cache == null) { - cache = new Srch_rslt_hash(); - cache_hash.Add_bry_obj(key, cache); - } - return cache; - } - public void Search(Xow_wiki search_wiki, Xoae_page page, Srch_qry qry) { - // generate 1 cmd per wiki - Xow_domain_itm[] domain_ary = qry.wiki_domains; int domain_ary_len = domain_ary.length; - for (int i = 0; i < domain_ary_len; ++i) { - Xow_domain_itm domain = domain_ary[i]; - try { - Xowe_wiki wiki = wiki_mgr.Get_by_or_make(domain.Domain_bry()); wiki.Init_assert(); - Assert_page_count(wiki); - Xows_ui_cmd cmd = new Xows_ui_cmd(this, qry, wiki, page, page.Tab_data().Close_mgr(), page.Tab_data().Tab().Html_itm(), null, null); // null b/c args are only used by drd - qry.Cmds__add(cmd); - } catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "search:wiki failed; wiki=~{0} err=~{1}", domain.Domain_str(), Err_.Message_lang(e));} // handle bad wikis, like "en.wikipedia.org-old"; DATE:2015-04-24 - } - qry.page_max = Int_.Max_value; - // do search and generate html - html_wkr.Init_by_wiki(search_wiki, search_wiki.Lang().Num_mgr(), qry); - int cmds_len = qry.Cmds__len(); - Bry_bfr tmp_bfr = Bry_bfr.new_(); - for (int i = 0; i < cmds_len; ++i) { - Xows_ui_cmd cmd = qry.Cmds__get_at(i); byte[] cmd_key = cmd.Key(); - cmd_hash.Add_if_dupe_use_nth(cmd_key, cmd); - boolean searching_db = cmd.Search(); - html_wkr.Gen_tbl(tmp_bfr, cmd.Rslt(), cmd_key, cmd.Wiki().Domain_bry(), searching_db); - } - page.Data_raw_(html_wkr.Gen_page(tmp_bfr.To_bry_and_clear())); - } - public void Search_end(Xows_ui_cmd cmd) { - cmd_hash.Del(cmd.Key()); - } - public void Cancel(byte[] cmd_key) { - Xows_ui_cmd cmd = (Xows_ui_cmd)cmd_hash.Get_by_bry(cmd_key); - if (cmd == null) return; - cmd.Cancel(); - cmd_hash.Del(cmd.Key()); - } - private void Assert_page_count(Xowe_wiki wiki) { - Xowd_db_file search_db = wiki.Data__core_mgr().Db__search(); - if (ask_for_upgrade - && wiki.App().Mode().Tid_is_gui() - && !search_db.Tbl__search_word().Ddl__page_count() - && !upgraded_wikis.Has(wiki.Domain_bry()) ) { - ask_for_upgrade = false; - upgraded_wikis.Add_as_key_and_val(wiki.Domain_bry()); - boolean ok = wiki.Appe().Gui_mgr().Kit().Ask_ok_cancel("", "", String_.Concat_lines_nl_skip_last - ( "XOWA would like to upgrade your search database for " + wiki.Domain_str() + "." - , "* Press OK to upgrade. This may take a few minutes." - , "* Press Cancel to skip. You will be able to search, but the results may be slower for multi-word searches (EX: 'The Earth')." - , "If you cancel, XOWA will ask you to upgrade this wiki again next time you restart the application." - )); - if (ok) - search_db.Tbl__search_word().Ddl__page_count__add(search_db.Tbl__search_link(), search_db.Tbl__cfg()); - } - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher_bldr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher_bldr.java deleted file mode 100644 index 6c6eb3069..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher_bldr.java +++ /dev/null @@ -1,96 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.specials.search.crts.*; -class Xows_db_matcher_bldr { - public Srch_word_row[] Gather_words_for_db(Cancelable cxl, Srch_crt_node matcher, Xowd_search_word_tbl word_tbl) { - List_adp rv = List_adp_.new_(); - Gather_words_for_db(cxl, matcher, rv, word_tbl); - rv.Sort_by(Srch_word_row_sorter.Page_count_dsc); - return (Srch_word_row[])rv.To_ary(Srch_word_row.class); - } - private void Gather_words_for_db(Cancelable cxl, Srch_crt_node matcher, List_adp rv, Xowd_search_word_tbl word_tbl) { - switch (matcher.tid) { - case Srch_crt_node.Tid_word: - byte[] word_text = matcher.raw; - if (Bry_.Has(word_text, Byte_ascii.Star)) - Load_word_many(cxl, rv, word_text, word_tbl); - else - Load_word_one(rv, word_text, word_tbl); - break; - case Srch_crt_node.Tid_word_quote: - List_adp tmp = List_adp_.new_(); - byte[][] words = Bry_split_.Split(matcher.raw, Byte_ascii.Space, Bool_.Y); - int words_len = words.length; - for (int i = 0; i < words_len; ++i) { - byte[] word = words[i]; - Load_word_one(tmp, word, word_tbl); - } - if (tmp.Count() == 0) return; // no words in db; EX: "xyz cba" - tmp.Sort_by(Srch_word_row_sorter.Page_count_dsc); - rv.Add(tmp.Get_at(0)); // add lowest page_count word to db; EX: search for "earth and" should search for "earth" only, but match for "earth and" - break; - case Srch_crt_node.Tid_and: - List_adp lhs_tmp = List_adp_.new_(), rhs_tmp = List_adp_.new_(); - Gather_words_for_db(cxl, matcher.lhs, lhs_tmp, word_tbl); - Gather_words_for_db(cxl, matcher.rhs, rhs_tmp, word_tbl); - List_adp_.Add_list(rv, Calc_lowest(lhs_tmp, rhs_tmp)); // calc side with lowest count; add to rv; - break; - case Srch_crt_node.Tid_or: - Gather_words_for_db(cxl, matcher.lhs, rv, word_tbl); - Gather_words_for_db(cxl, matcher.rhs, rv, word_tbl); - break; - case Srch_crt_node.Tid_not: break; // never add "NOT" to db_search - case Srch_crt_node.Tid_null: break; // should not happen - default: throw Err_.new_unhandled(matcher.tid); - } - } - private List_adp Calc_lowest(List_adp lhs, List_adp rhs) { - int lhs_count = Calc(lhs); - int rhs_count = Calc(rhs); - // never return 0 as lowest count; note that NOT will return 0; - if (lhs_count == 0) return rhs; - else if (rhs_count == 0) return lhs; - else return lhs_count < rhs_count ? lhs : rhs; - } - private int Calc(List_adp list) { - int rv = 0; - int len = list.Count(); - for (int i = 0; i < len; ++i) { - Srch_word_row word = (Srch_word_row)list.Get_at(i); - rv += word.page_count; - } - return rv; - } - private void Load_word_one(List_adp rv, byte[] word_text, Xowd_search_word_tbl word_tbl) { - Xoa_app_.Usr_dlg().Prog_many("", "", "search:word by text; word=~{0}", word_text); - Xowd_search_word_row row = word_tbl.Select_by_or_null(word_text); if (row == Xowd_search_word_row.Null) return; - Srch_word_row word = new Srch_word_row(row.Id(), row.Text(), row.Page_count()); - rv.Add(word); - } - private void Load_word_many(Cancelable cxl, List_adp rv, byte[] word_text, Xowd_search_word_tbl word_tbl) { - Xoa_app_.Usr_dlg().Prog_many("", "", "search:word by wildcard; word=~{0}", word_text); - Xowd_search_word_row[] rows = word_tbl.Select_in(cxl, word_text); - int len = rows.length; - for (int i = 0; i < len; ++i) { - Xowd_search_word_row row = rows[i]; - rv.Add(new Srch_word_row(row.Id(), row.Text(), row.Page_count())); - } - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java deleted file mode 100644 index 8c5464c4e..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.java +++ /dev/null @@ -1,124 +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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.brys.fmtrs.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*; -class Xows_html_wkr { - private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); - private Srch_qry qry; private Xow_wiki wiki; private Xol_num_mgr num_mgr; - private Xoh_lnki_bldr lnki_bldr; private Xoh_anchor_kv_bldr self_lnkr = new Xoh_anchor_kv_bldr(); private Xows_html_row html_rows; - public void Init_by_wiki(Xow_wiki wiki, Xol_num_mgr num_mgr, Srch_qry qry) { - this.wiki = wiki; this.num_mgr = num_mgr; this.qry = qry; - this.lnki_bldr = wiki.App().Html__lnki_bldr(); - this.html_rows = new Xows_html_row(lnki_bldr); - self_lnkr.Init_w_qarg(qry.special_link_base_href); - } - public byte[] Gen_page(byte[] tbls) { - byte[] rslts_hdr = fmtr_rslts.Bld_bry_many(tmp_bfr, num_mgr.Format_num(qry.itms_bgn + List_adp_.Base1), num_mgr.Format_num(qry.itms_end), qry.search_raw); - byte[] option_link = lnki_bldr.Href_(Bry_.new_a7("home"), wiki.Ttl_parse(Bry_.new_a7("Help:Options/Search"))).Img_16x16(Xoh_img_path.Img_option).Bld_to_bry(); - fmtr_page.Bld_bfr_many(tmp_bfr, rslts_hdr, option_link, Paging_link(Bool_.N), Paging_link(Bool_.Y), tbls); - return tmp_bfr.To_bry_and_clear(); - } - public void Gen_tbl(Bry_bfr bfr, Srch_rslt_list rslt, byte[] cmd_key, byte[] wiki_domain, boolean searching_db) { - html_rows.Init(rslt); - byte[] search_link = lnki_bldr.Href_(wiki_domain, wiki.Ttl_parse(self_lnkr.Bld_to_bry())).Caption_(wiki_domain).Img_16x16(Xoh_img_path.Img_search).Img_pos_is_left_(Bool_.Y).Bld_to_bry(); - fmtr_tbl.Bld_bfr_many(bfr, search_link, searching_db ? Cancel_link(wiki_domain, cmd_key) : Bry_.Empty, Bry_hdr_len, Bry_hdr_ttl, Xows_ui_async__html.Gen_insert_key(wiki_domain), html_rows); - } - private byte[] Cancel_link(byte[] domain, byte[] cmd_key) { - lnki_bldr.Id_(Bry_.Add(Bry_.new_a7("xowa_cancel_"), domain)); - lnki_bldr.Href_(wiki, self_lnkr.Add_int(Xows_arg_mgr.Arg_bry_page_index, qry.page_idx).Add_bry(Xows_arg_mgr.Arg_bry_cancel, cmd_key).Bld_to_bry()); - lnki_bldr.Title_(Bry_cancel); - lnki_bldr.Img_16x16(Xoh_img_path.Img_cancel); - return lnki_bldr.Bld_to_bry(); - } - public byte[] Paging_link(boolean fwd) { - int paging_idx = qry.page_idx; - byte[] title = null, img_path = Bry_.Empty; - boolean img_pos_is_left = true; - if (fwd) { - ++paging_idx; - // if (paging_idx > qry.Page_max()) return Gfh_entity_.Nbsp_num_bry; - img_pos_is_left = false; - img_path = Xoh_img_path.Img_go_fwd; - title = Bry_paging_fwd; - } - else { - --paging_idx; - if (paging_idx < 0) return Gfh_entity_.Nbsp_num_bry; - img_path = Xoh_img_path.Img_go_bwd; - title = Bry_paging_bwd; - } - return lnki_bldr.Title_(title).Href_(wiki, self_lnkr.Add_int(Xows_arg_mgr.Arg_bry_page_index, paging_idx).Bld_to_bry()).Img_16x16(img_path).Img_pos_is_left_(img_pos_is_left).Caption_(title).Bld_to_bry(); - } - private static final Bry_fmtr fmtr_page = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "~{rslts_hdr}~{option_link}" - , "
        ~{bwd_a}~{fwd_a}
        ~{tbls}" - , "
        ~{bwd_a}~{fwd_a}
        " - ), "rslts_hdr", "option_link", "bwd_a", "fwd_a", "tbls"); - private static final Bry_fmtr fmtr_tbl = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , " " - , " " - , " " - , " " - , " " - , " " - , " ~{rows}" - , " " - , " " - , "
        ~{wiki}~{cancel}" - , "
        ~{hdr_len}" - , " ~{hdr_ttl}" - , "
        " - ), "wiki", "cancel", "hdr_len", "hdr_ttl", "insert_key", "rows"); - private static final Bry_fmtr fmtr_rslts = Bry_fmtr.new_("Results ~{bgn} of ~{end} for ~{raw}", "bgn", "end", "raw"); - private static final byte[] Bry_paging_fwd = Bry_.new_a7("Next"), Bry_paging_bwd = Bry_.new_a7("Previous"), Bry_cancel = Bry_.new_a7("Stop searching") - , Bry_hdr_len = Bry_.new_a7("Page length"), Bry_hdr_ttl = Bry_.new_a7("Page title") - ; -} -class Xows_html_row implements gplx.core.brys.Bfr_arg { - private final Xoh_lnki_bldr lnki_bldr; private Srch_rslt_list rslt; - private final Object thread_lock = new Object(); - public Xows_html_row(Xoh_lnki_bldr lnki_bldr) {this.lnki_bldr = lnki_bldr;} - public Xows_html_row Init(Srch_rslt_list rslt) {this.rslt = rslt; return this;} - public void Bfr_arg__add(Bry_bfr bfr) { // A - int len = rslt.Len(); - for (int i = 0; i < len; ++i) { - Srch_rslt_itm row = rslt.Get_at(i); - Gen_html(bfr, row); - } - } - public void Gen_html(Bry_bfr bfr, Srch_rslt_itm row) { - synchronized (thread_lock) { - lnki_bldr.Href_(row.wiki_bry, row.page_ttl); - byte[] title = row.page_ttl.Full_txt(); - lnki_bldr.Title_(title); - lnki_bldr.Caption_(title); - fmtr.Bld_bfr_many(bfr, Gfh_utl.Encode_id_as_str(row.key), row.page_len, lnki_bldr.Bld_to_bry()); - } - } - public Bry_fmtr Fmtr() {return fmtr;} private final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
  • ~{page_len}" - , " ~{lnki}" // SERVER:". -*/ -package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -public class Srch_crt_parser { - private final Srch_parser_ctx parse_ctx = new Srch_parser_ctx(); private byte[] src; - public Srch_crt_node Parse(byte[] src) { - this.src = src; - Srch_crt_tkn[] tkns = new Srch_crt_scanner().Scan(src); - return Parse_itm_or(parse_ctx.Init(tkns)); - } - private Srch_crt_node Parse_itm_or(Srch_parser_ctx parse_ctx) { - Srch_crt_node lhs = Parse_itm_and(parse_ctx); - while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_or)) { - parse_ctx.Move_next(); - Srch_crt_node rhs = Parse_itm_and(parse_ctx); - lhs = New_join(Srch_crt_node.Tid_or, lhs, rhs); - } - return lhs; - } - private Srch_crt_node Parse_itm_and(Srch_parser_ctx parse_ctx) { - Srch_crt_node lhs = Parse_itm_not(parse_ctx); - while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_and)) { - parse_ctx.Move_next(); - Srch_crt_node rhs = Parse_itm_not(parse_ctx); - lhs = New_join(Srch_crt_node.Tid_and, lhs, rhs); - } - return lhs; - } - private Srch_crt_node Parse_itm_not(Srch_parser_ctx parse_ctx) { - Srch_crt_node lhs = Parse_itm_leaf(parse_ctx); - while (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_not)) { - parse_ctx.Move_next(); - Srch_crt_node rhs = Parse_itm_leaf(parse_ctx); - lhs = New_join(Srch_crt_node.Tid_not, null, rhs); - } - return lhs; - } - private Srch_crt_node Parse_itm_leaf(Srch_parser_ctx parse_ctx) { - if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_paren_bgn)) { - parse_ctx.Move_next(); - Srch_crt_node lhs = Parse_itm_or(parse_ctx); - if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_paren_end)) parse_ctx.Move_next(); // skip token - return lhs; - } - else if (parse_ctx.Cur_tid(Srch_crt_tkn.Tid_eos)) - return Srch_crt_node.Null; - else { - Srch_crt_tkn word_tkn = parse_ctx.Move_next(); - if (word_tkn.tid == Srch_crt_tkn.Tid_not) { - word_tkn = parse_ctx.Move_next(); - if (word_tkn == null) return Srch_crt_node.Null; // occurs in "a -" - Srch_crt_node word_itm = New_word(word_tkn, src); - return New_join(Srch_crt_node.Tid_not, null, word_itm); - } - else - return New_word(word_tkn, src); - } - } - private static Srch_crt_node New_word(Srch_crt_tkn tkn, byte[] src) { - int tid = tkn.tid == Srch_crt_tkn.Tid_word ? Srch_crt_node.Tid_word : Srch_crt_node.Tid_word_quote; - return new Srch_crt_node(tid, tkn.val, null, null); - } - private static Srch_crt_node New_join(int tid, Srch_crt_node lhs, Srch_crt_node rhs) {return new Srch_crt_node(tid, null, lhs, rhs);} -} -class Srch_parser_ctx { - private Srch_crt_tkn[] ary; private int pos = 0; private int ary_len; - public Srch_parser_ctx Init(Srch_crt_tkn[] ary) { - this.ary = ary; - this.ary_len = ary.length; - this.pos = 0; - return this; - } - public boolean Cur_tid(byte tid) {return pos < ary_len ? tid == ary[pos].tid : tid == Srch_crt_tkn.Tid_eos;} - public Srch_crt_tkn Move_next() { - Srch_crt_tkn rv = null; - if (pos < ary_len) rv = ary[pos++]; - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java b/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java deleted file mode 100644 index 64409d79c..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/crts/Srch_crt_scanner.java +++ /dev/null @@ -1,144 +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.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -import gplx.core.primitives.*; import gplx.core.btries.*; -class Srch_crt_scanner { - private final List_adp tkns = List_adp_.new_(); private byte[] src; private int src_len, pos, txt_bgn; - private final Ordered_hash tmp_list = Ordered_hash_.New(); private final Bry_bfr tmp_bfr = Bry_bfr.new_(); - public Srch_crt_tkn[] Scan(byte[] src) { - this.src = src; this.src_len = src.length; - tkns.Clear(); pos = 0; txt_bgn = -1; - while (pos < src_len) { - byte cur_b = src[pos]; - Object cur_obj = trie.Match_bgn_w_byte(cur_b, src, pos, src_len); - if (cur_obj == null) { // text character - if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it - ++pos; - } - else { // AND, OR, (, ), -, \s, " - int pos_end = trie.Match_pos(); - byte cur_tid = ((Byte_obj_val)cur_obj).Val(); - if (Cur_join_is_word(cur_tid, pos_end)) continue; // ignore words containing "and", "or"; EX: "random"; "for" - if (txt_bgn != -1) { // pending word; create - Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos); - txt_bgn = -1; - } - switch (cur_tid) { - case Srch_crt_tkn.Tid_space: // discard spaces - pos = Bry_find_.Find_fwd_while(src, pos, src_len, Byte_ascii.Space); - break; - case Srch_crt_tkn.Tid_quote: // find end quote and add as word - int quote_bgn = pos + 1; - int quote_end = Bry_find_.Find_fwd(src, Byte_ascii.Quote, quote_bgn, src_len); - if (quote_end == Bry_find_.Not_found) throw Err_.new_wo_type("could not find end quote", "src", String_.new_u8(src)); - Tkns_add_word(Srch_crt_tkn.Tid_word_quoted, quote_bgn, quote_end); - pos = quote_end + 1; // +1 to place after quote - break; - case Srch_crt_tkn.Tid_not: - Tkns_add_word(Srch_crt_tkn.Tid_not, pos, pos_end); - pos = pos_end; - break; - case Srch_crt_tkn.Tid_paren_bgn: case Srch_crt_tkn.Tid_paren_end: - case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or: - tkns.Add(new_tkn(cur_tid, src, pos, pos_end)); - pos = pos_end; - break; - default: throw Err_.new_unhandled(cur_tid); - } - } - } - if (txt_bgn != -1) { // pending word; create - Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos); - txt_bgn = -1; - } - return (Srch_crt_tkn[])tkns.To_ary_and_clear(Srch_crt_tkn.class); - } - private boolean Cur_join_is_word(byte cur_tid, int pos_end) { // extra logic to handle and / or occuring in unquoted strings; EX: "random"; "for" - switch (cur_tid) { - default: return false; // only look at AND, OR, - - case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or: case Srch_crt_tkn.Tid_not: - break; - } - boolean join_is_word = true; - if (txt_bgn == -1) { // no pending word; - if (cur_tid == Srch_crt_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b - byte nxt_b = pos_end < src_len ? src[pos_end] : Byte_ascii.Null; - Object nxt_obj = trie.Match_bgn_w_byte(nxt_b, src, pos_end, src_len); - if (nxt_obj == null) // next tkn is text; join must be word - join_is_word = true; - else { // next tkn is tkn - byte nxt_tid = ((Byte_obj_val)nxt_obj).Val(); - switch (nxt_tid) { - case Srch_crt_tkn.Tid_space: case Srch_crt_tkn.Tid_quote: - case Srch_crt_tkn.Tid_paren_bgn: case Srch_crt_tkn.Tid_paren_end: - join_is_word = false; // next tkn is sym; and/or is not word; EX: a AND ; a AND"b"; a AND(b) - break; - case Srch_crt_tkn.Tid_not: case Srch_crt_tkn.Tid_and: case Srch_crt_tkn.Tid_or: - join_is_word = true; // next tkn is and or not; and/or is word; EX: andor; oror; or-abc; - break; - default: throw Err_.new_unhandled(cur_tid); - } - } - } - else { // pending word; cur join must be word; EX: "grand": "and" invoked and "gr" pending - join_is_word = true; - } - if (join_is_word) { - if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it - pos = pos_end; - return true; - } - if (txt_bgn != -1) { - Tkns_add_word(Srch_crt_tkn.Tid_word, txt_bgn, pos); // create word - txt_bgn = -1; - } - return false; - } - private void Tkns_add_word(byte tid, int src_bgn, int src_end) { - if (tkns.Count() > 0) { // at least 1 tkn; check for "auto-and" - Srch_crt_tkn last_tkn = (Srch_crt_tkn)tkns.Get_at_last(); - if (last_tkn.tid == Srch_crt_tkn.Tid_word) // previous tkn is word; auto "AND" words; EX: A B -> A AND B - tkns.Add(new Srch_crt_tkn(Srch_crt_tkn.Tid_and, Bry_and)); - } - if (tid == Srch_crt_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b - byte[] cur_word = Bry_.Mid(src, src_bgn, src_end); - byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split_ttl_into_words(null, tmp_list, tmp_bfr, cur_word); - int words_len = words.length; - if ( words_len == 1 // only one word - && !Bry_.Eq(words[0], cur_word) // split word not same as raw - && Bry_find_.Find_fwd(cur_word, Byte_ascii.Star) == -1 // no asterisk - ) { - tkns.Add(new Srch_crt_tkn(tid, words[0])); - return; - } - if (words.length > 1) // multiple words; add as quoted-term; EX: "a-b" - tid = Srch_crt_tkn.Tid_word_quoted; - } - tkns.Add(new_tkn(tid, src, src_bgn, src_end)); - } - private Srch_crt_tkn new_tkn(byte tid, byte[] src, int val_bgn, int val_end) {return new Srch_crt_tkn(tid, Bry_.Mid(src, 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_a7()// NOTE:ci.ascii:OR / AND only - .Add_str_byte(" " , Srch_crt_tkn.Tid_space) - .Add_str_byte("\"" , Srch_crt_tkn.Tid_quote) - .Add_str_byte("-" , Srch_crt_tkn.Tid_not) - .Add_str_byte("(" , Srch_crt_tkn.Tid_paren_bgn) - .Add_str_byte(")" , Srch_crt_tkn.Tid_paren_end) - .Add_str_byte("or" , Srch_crt_tkn.Tid_or) - .Add_str_byte("and" , Srch_crt_tkn.Tid_and); -} diff --git a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java deleted file mode 100644 index 699fc8f47..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_db_mgr.java +++ /dev/null @@ -1,80 +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 . -*/ -//namespace gplx.xowa.specials.search.dbs { -// using gplx.dbs; using gplx.xowa.wikis.data.tbls; -// using gplx.xowa.langs.cases; using gplx.xowa.wikis.nss; -// // workset_count -// // workset_score_min -// class Srch_db_mgr { -// private Srch_word_tbl srch_word_tbl = new Srch_word_tbl(null, null); -// private Srch_page_tbl srch_page_tbl = new Srch_page_tbl(); -// private Page_tbl page_tbl = new Page_tbl(); -// public void Search(Srch_request req) { -// List_adp results = req.results; -// int curr = results.Count(); -// int need = curr + req.req__count; -// while (curr < need) { -// // foreach (word) -// srch_word_tbl.Get(req, null); // read words -// srch_page_tbl.Get(req); // get pages for every words -// // add to potential results; skip if failed and / not (but can't do quote) -// page_tbl.Get(req); // get actual page and check for ns; quote; redirect -// // repeat until matched -// need = results.Count(); -// } -// } -// // get all pages in word_id set sorted by page_search_score -// // stop if -// // - no more pages; normal case -// // - page_score < workset_score_min; case with many pages (1000 pages) -//// private int Get_word_id_pages -//// ( Cancelable cancelable, Xow_wiki wiki, Xol_case_mgr case_mgr -//// , Srch_request req, Xows_ui_cmd cmd, Srch_qry qry, Srch_rslt_hash cache -//// , Db_attach_rdr attach_rdr, String sql, Xowd_page_tbl page_tbl -//// , Srch_word_row word, Srch_crt_node matcher, int rslts_wanted, int workset_score_min) { -//// int rslts_found = 0; -//// Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); -//// Db_rdr rdr = attach_rdr.Exec_as_rdr(sql); -//// try { -//// while (rdr.Move_next()) { -//// if (cancelable.Canceled()) return -1; -//// word.Rslts_offset_add_1(); -//// int page_ns = rdr.Read_int(page_tbl.Fld_page_ns()); -//// if (!qry.Ns_mgr().Has(page_ns)) continue; // ignore: ns doesn't match -//// byte[] page_ttl = rdr.Read_bry_by_str(page_tbl.Fld_page_title()); -//// // Io_mgr.Instance.AppendFilStr("C:\\temp.txt", String_.new_u8(word.Text()) + "|" + Int_.To_str(page_ns) + "|" + String_.new_u8(page_ttl) + "\n"); -//// byte[] page_ttl_lc = case_mgr.Case_build_lower(Xoa_ttl.Replace_unders(page_ttl)); -//// byte[][] page_ttl_words = Bry_split_.Split(page_ttl_lc, Byte_ascii.Space, Bool_.Y); -//// if (!matcher.Matches(page_ttl_lc, page_ttl_words)) continue; // ignore: ttl doesn't match matcher -//// int page_id = rdr.Read_int(page_tbl.Fld_page_id()); -//// int page_len = rdr.Read_int(page_tbl.Fld_page_len()); -//// int page_link_score = 0; //rdr.Read_int(page_tbl.Fld_page_link_score()); -//// Xow_ns ns = ns_mgr.Ids_get_or_null(page_ns); -//// byte[] page_ttl_w_ns = ns.Gen_ttl(page_ttl); -//// if (cache.Has(page_ttl_w_ns)) continue; // ignore: page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" -//// Xoa_ttl ttl = wiki.Ttl_parse(page_ttl_w_ns); -//// Srch_rslt_itm row = new Srch_rslt_itm(wiki.Domain_bry(), ttl, page_id, page_len); -//// cmd.Add_rslt(row); -//// if (++rslts_found == rslts_wanted) break; // stop: found enough results; DATE:2015-04-24 -//// } -//// } finally {rdr.Rls();} -//// if (rslts_found == 0) word.Rslts_done_y_(); // read through entire rdr and nothing found; mark word done -//// return rslts_found; -//// } -// } -//} diff --git a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java b/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java deleted file mode 100644 index dc702ce24..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/dbs/Srch_word_row.java +++ /dev/null @@ -1,125 +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 . -*/ -//namespace gplx.xowa.specials.search.dbs { -// using gplx.dbs; using gplx.xowa.wikis.data.tbls; -// // a -// // a b -// // a* -// class Srch_word_tbl { -// private final Db_conn conn; -// private final Xowd_search_word_tbl tbl; -// public Srch_word_tbl(Db_conn conn, Xowd_search_word_tbl tbl) {this.conn = conn; this.tbl = tbl;} -// public void Get(Srch_request req, Srch_cache_word cache_word) { -// // int req_count = req.req__count; -// // conn.Stmt_select_order(tbl.Tbl_name(), String_.Ary(tbl.Fld_id(), tbl.Fld_w())); -// // SELECT word_id, word_text FROM search_word WHERE word_text LIKE "~{word}%" AND word_text > '' ORDER BY word_page_score DESC OFFSET 0; -// Db_qry qry = Db_qry_.select_() -// .From_(tbl.Tbl_name()) -// .Cols_(tbl.Fld_id(), tbl.Fld_text(), tbl.Fld_page_count(), tbl.Fld_page_score_max()) -// .Where_(Db_crt_.New_like(tbl.Fld_text(), "")) -// .OrderBy_(tbl.Fld_page_score_max(), false) -// // .Offset_(); -// ; -// Db_stmt stmt = conn.Stmt_new(qry); -// stmt.Clear().Crt_str(tbl.Fld_text(), req.search); -// Db_rdr rdr = stmt.Exec_select__rls_auto(); -// int cur_count = 0; -// while (rdr.Move_next()) { -// int word_id = rdr.Read_int(tbl.Fld_id()); -// byte[] word_text = rdr.Read_bry_by_str(tbl.Fld_text()); -// int page_count = rdr.Read_int(tbl.Fld_page_count()); -// int page_score_max = rdr.Read_int(tbl.Fld_page_score_max()); -// Srch_word_row row = new Srch_word_row(word_id, word_text, page_count, page_score_max); -// cache_word.words.Add(row); -// cur_count += page_count; -// ++cache_word.offset; -// if (cur_count >= (req.req__count * 2)) break; -// } -// /* -// Get_rng; now in set of 100, scores may range from 1234 to 50; search every word to get minimum -// */ -// } -// } -// class Srch_page_tbl { -// public void Get(Srch_request req) { -// } -// } -// class Page_tbl { -// public void Get(Srch_request req) {} -// } -// class Srch_word_row { -// public int word_id; -// public byte[] text; -// public int page_count; -// public int page_score_max; -// public int rslts_offset; -// public boolean rslts_done; -// public Srch_word_row(int word_id, byte[] text, int page_count, int page_score_max) { -// this.word_id = word_id; this.text = text; this.page_count = page_count; this.page_score_max = page_score_max; -// rslts_offset = 0; rslts_done = false; -// } -// public void Rslts_offset_add_1() {++rslts_offset;} -// public void Rslts_done_y_() {rslts_done = true;} -// } -// class Srch_page_row { -// public int word_id; -// public int page_id; -// public void Load(int word_id, int page_id) { -// this.word_id = word_id; this.page_id = page_id; -// } -// } -// class Srch_cache_word { -// public byte[] search; -// public final List_adp words = List_adp_.new_(); -// public int offset; -// public void Init_new(byte[] search) { -// this.search = search; -// words.Clear(); -// offset = 0; -// } -// } -// class Srch_request { -// public String search; -// public int req__count; -// public boolean wildcard; -// public String bmk__word__text; -// public int bmk__page__word_id; -// public int bmk__page__page_id; -// // all_pages; -// // view_pages -// public final List_adp results = List_adp_.new_(); -// public final Srch_cache_word tbl__word = new Srch_cache_word(); -// public void Init_new(String search, boolean wildcard, int req__count) { -// this.search = search; this.wildcard = wildcard; this.req__count = req__count; -// this.bmk__word__text = ""; -// this.bmk__page__word_id = -1; -// this.bmk__page__page_id = -1; -// tbl__word.Init_new(Bry_.new_a7(search)); -// results.Clear(); -// } -// public void Init_continue(int req__count) { -// } -// } -// class Srch_query { -// public String raw; -// public Srch_query(String raw) { -// this.raw = raw; -// // separate to words -// } -// } -//} diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v1.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v1.java deleted file mode 100644 index cf16e5633..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v1.java +++ /dev/null @@ -1,69 +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.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -import gplx.core.primitives.*; -import gplx.xowa.langs.*; -class Xows_text_parser__v1 { - private Xol_lang_itm lang; private Bry_bfr bfr = Bry_bfr.new_(255); - private final Ordered_hash list = Ordered_hash_.New_bry(); - public void Init(Xol_lang_itm lang) {this.lang = lang;} - public void Parse(byte[] src, int src_len, int bgn, int end) { - if (lang != null) { // null lang passed in by searcher - src = lang.Case_mgr().Case_build_lower(src); - src_len = src.length; - } - int i = 0; boolean word_done = false; - while (true) { - if (word_done || i == src_len) { - if (bfr.Len() > 0) { - byte[] word = bfr.To_bry_and_clear(); - if (!list.Has(word)) list.Add(word, word); // don't add same word twice; EX: Title of "Can Can" should only have "Can" in index - } - if (i == src_len) break; - word_done = false; - } - byte b = src[i]; - switch (b) { - case Byte_ascii.Underline: // underline is word-breaking; EX: A_B -> A, B - case Byte_ascii.Space: // should not occur, but just in case (only underscores) - case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: // should not occur in titles, but just in case - - case Byte_ascii.Dash: // treat hypenated words separately - case Byte_ascii.Dot: // treat abbreviations as separate words; EX: A.B.C. - case Byte_ascii.Bang: case Byte_ascii.Hash: case Byte_ascii.Dollar: case Byte_ascii.Percent: - case Byte_ascii.Amp: case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Star: - case Byte_ascii.Comma: case Byte_ascii.Slash: - case Byte_ascii.Colon: case Byte_ascii.Semic: case Byte_ascii.Gt: - case Byte_ascii.Question: case Byte_ascii.At: case Byte_ascii.Brack_bgn: case Byte_ascii.Brack_end: - case Byte_ascii.Pow: case Byte_ascii.Tick: - case Byte_ascii.Curly_bgn: case Byte_ascii.Pipe: case Byte_ascii.Curly_end: case Byte_ascii.Tilde: - case Byte_ascii.Quote: case Byte_ascii.Apos: // FUTURE: apos will split "Earth's" to Earth and s; should remove latter - ++i; - word_done = true; - break; - default: - bfr.Add_byte(b); - ++i; - break; - } - } -// byte[][] rv = (byte[][])list.To_ary(typeof(byte[])); -// list.Clear(); list.Resize_bounds(16); -// return rv; - } -} 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 deleted file mode 100644 index bc77c77c5..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2.java +++ /dev/null @@ -1,107 +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.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 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, - private boolean dirty; private Xows_text_tkn__split parser__ws; - public void Init_for_ttl(Xob_word_mgr word_mgr, Xol_case_mgr case_mgr) { - this.word_mgr = word_mgr; this.case_mgr = case_mgr; - trie.Clear(); - this.parser__ws = Xows_text_tkn__split.new_(trie, Bool_.N, " ", "\t", "\n", "\r", "_"); - Xows_text_tkn__split.new_(trie, Bool_.N, "!", "?"); - Xows_text_tkn__split.new_(trie, Bool_.N, "(", ")"); - Xows_text_tkn__split.new_(trie, Bool_.N, "/"); - Xows_text_tkn__ellipsis.new_(trie, ".."); - Xows_text_tkn__apos.new_(trie, "'", Byte_ascii.Ltr_s); - } - public void Parse(byte[] src, int src_len, int bgn, int end) { - this.src = src; this.end = end; // this.bgn = bgn; - this.dirty = false; this.bgn__ws = bgn__dash = bgn__slash = -1; - this.src = case_mgr.Case_build_lower(src); src_len = this.src.length; - int pos = bgn; - while (true) { - boolean is_last = pos == end; - if (is_last) { // do split - Word__add(bgn__ws, end); - break; - } - byte b = src[pos]; - Object o = trie.Match_bgn_w_byte(b, src, pos, end); - if (o == null) { // unknown sequence; word-char - Char__add(b, pos); - ++pos; - } - else { - Xows_text_tkn parser = (Xows_text_tkn)o; - pos = parser.Parse(this, src, end, pos, trie.Match_pos()); - } - } - } - public int Bgn__ws() {return bgn__ws;} private int bgn__ws; - public int Bgn__dash() {return bgn__dash;} private int bgn__dash; - public int Bgn__slash() {return bgn__slash;} private int bgn__slash; - public void Bgn__ws_clear() {this.bgn__ws = -1;} - public void Bgn__dash_(int v) {this.bgn__dash = v;} - public void Bgn__slash_(int v) {this.bgn__slash= v;} - public void Word__add(int bgn__ws, int word_end) { - if (bgn__ws == word_end) return; // handle situations like "A!" where sym is at eos - if (bgn__ws == -1) return; // handle situations like "A... " where " " is different than "..." - byte[] word = dirty ? bfr.To_bry_and_clear() : Bry_.Mid(src, bgn__ws, word_end); - word_mgr.Add(word); - if (bgn__dash != -1) { - word_mgr.Add(Bry_.Mid(src, bgn__dash, word_end)); - bgn__dash = -1; - } - } - public void Char__add(byte b, int pos) { - if (dirty) - bfr.Add_byte(b); - else { - if (bgn__ws == -1) - bgn__ws = pos; - } - } - public boolean Ws__is_word_end(int pos) {return parser__ws.Is_word_end(src, end, pos);} -} -class Xob_word_mgr { - private final Ordered_hash hash = Ordered_hash_.New_bry(); - public void Clear() {hash.Clear();} - public int Len() {return hash.Count();} - public Xob_word_itm Get_at(int i) {return (Xob_word_itm)hash.Get_at(i);} - public void Add(byte[] word) { - Xob_word_itm itm = (Xob_word_itm)hash.Get_by(word); - if (itm == null) { - itm = new Xob_word_itm(word); - hash.Add(word, itm); - } - itm.Count_add_1_(); - } -} -class Xob_word_itm { - public Xob_word_itm(byte[] word) { - this.word = word; - this.count = 0; - } - public byte[] Word() {return word;} private final byte[] word; - public int Count() {return count;} private int count; public void Count_add_1_() {++count;} - @gplx.Internal protected Xob_word_itm Count_(int v) {this.count = v; return this;} -} 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 deleted file mode 100644 index 1c474c904..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_parser__v2_tst.java +++ /dev/null @@ -1,156 +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.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -import org.junit.*; import gplx.xowa.langs.cases.*; -public class Xows_text_parser__v2_tst { - private final Xows_text_parser__v2_fxt fxt = new Xows_text_parser__v2_fxt(); - @Before public void init() {fxt.Init();} - @Test public void Word__one() { - fxt.Clear().Test_split("abcd", "abcd"); - } - @Test public void Word__many() { - fxt.Clear().Test_split("abc d ef", "abc", "d", "ef"); - } - @Test public void Ws__many() { - fxt.Clear().Test_split("a b", "a", "b"); - } - @Test public void Ws__bgn() { - fxt.Clear().Test_split(" a", "a"); - } - @Test public void Ws__end() { - fxt.Clear().Test_split(" a", "a"); - } - @Test public void Under() { - fxt.Clear().Test_split("a_b", "a", "b"); - } - @Test public void Lowercase() { - fxt.Clear().Test_split("A B C", "a", "b", "c"); - } - @Test public void Dupe() { - fxt.Clear().Test_split("a a a", fxt.Make_word("a", 3)); - } - @Test public void Dupe__lowercase() { - fxt.Clear().Test_split("a A", fxt.Make_word("a", 2)); - } - @Test public void Dot__acronym() { // EX: "History of U.S.A. Science " - fxt.Clear().Test_split("abc D.E.F. ghi", "abc", "d.e.f.", "ghi"); - } - @Test public void Dot__initials() { // EX: "H. G. Wells" - fxt.Clear().Test_split("a. b. cde", "a.", "b.", "cde"); - } - @Test public void Dot__abrv() { // EX: "vs.", "no." - fxt.Clear().Test_split("a vs. b", "a", "vs.", "b"); - } - @Test public void Dot__internet() { // EX: "en.wikipedia.org" - fxt.Clear().Test_split("a.com", "a.com"); - } - @Test public void Ellipsis__basic() { // EX: "Nights into Dreams..." - fxt.Clear().Test_split("a... bc d", "a", "...", "bc", "d"); - } - @Test public void Ellipsis__bgn() { - fxt.Clear().Test_split("...a", "...", "a"); - } - @Test public void Ellipsis__end() { - fxt.Clear().Test_split("a...", "a", "..."); - } - @Test public void Ellipsis__no_ws() { - fxt.Clear().Test_split("a...b", "a", "...", "b"); - } - @Test public void Apos__contraction() { // EX: "I'm" - fxt.Clear().Test_split("i'm", "i'm"); - } - @Test public void Apos__multiple() { - fxt.Clear().Test_split("a''b", "a''b"); - } - @Test public void Apos__possessive_singular_eos() {// EX: "wiki's" - fxt.Clear().Test_split("a's", "a", "a's"); - } - @Test public void Apos__possessive_singular_word() { - fxt.Clear().Test_split("a's b", "a", "a's", "b"); - } - @Test public void Apos__possessive_plural_eos() {// EX: "wiki'" - fxt.Clear().Test_split("a'", "a", "a'"); - } - @Test public void Apos__possessive_plural_word() { - fxt.Clear().Test_split("a' b", "a", "a'", "b"); - } - @Test public void Bang__lone() { - fxt.Clear().Test_split("! a", "a"); - } - @Test public void Bang__word() { - fxt.Clear().Test_split("a!", "a"); - } - @Test public void Bang__sentence() {// EX: "A!" - fxt.Clear().Test_split("a b!", "a", "b"); - } - @Test public void Question__sentence() {// EX: "A?" - fxt.Clear().Test_split("a?", "a"); - } - @Test public void Parens_both() {// EX: "A (letter)" - fxt.Clear().Test_split("a (b)", "a", "b"); - } - @Test public void Slash__word() {// EX: "Good_cop/bad_cop" - fxt.Clear().Test_split("a/b", "a", "b"); - } - // apos: 'Some apostrophe sentence' ? -} -class Xows_text_parser__v2_fxt { - private final Xows_text_parser__v2 word_parser = new Xows_text_parser__v2(); - private final Xob_word_mgr word_mgr = new Xob_word_mgr(); - private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); - private Xol_case_mgr case_mgr; - public void Init() { - case_mgr = Xol_case_mgr_.A7(); - word_parser.Init_for_ttl(word_mgr, case_mgr); - } - public Xows_text_parser__v2_fxt Clear() { - word_mgr.Clear(); - return this; - } - public Xob_word_itm Make_word(String raw, int count) {return new Xob_word_itm(Bry_.new_u8(raw)).Count_(count);} - public void Test_split(String src, String... expd_words) { - int len = expd_words.length; - Xob_word_itm[] ary = new Xob_word_itm[len]; - for (int i = 0; i < len; ++i) { - ary[i] = Make_word(expd_words[i], 1); - } - Test_split(src, ary); - } - public void Test_split(String src, Xob_word_itm... expd_words) { - byte[] src_bry = Bry_.new_u8(src); - word_parser.Parse(src_bry, src_bry.length, 0, src_bry.length); - Tfds.Eq_str_lines(To_str(expd_words), To_str(word_mgr)); - } - private String To_str(Xob_word_itm[] word_ary) { - int len = word_ary.length; - for (int i = 0; i < len; ++i) { - if (i != 0) tmp_bfr.Add_byte_nl(); - Xob_word_itm word = word_ary[i]; - tmp_bfr.Add(word.Word()).Add_byte_pipe(); - tmp_bfr.Add_int_variable(word.Count()); - } - return tmp_bfr.To_str_and_clear(); - } - private String To_str(Xob_word_mgr word_mgr) { - int len = word_mgr.Len(); - Xob_word_itm[] ary = new Xob_word_itm[len]; - for (int i = 0; i < len; ++i) - ary[i] = word_mgr.Get_at(i); - return To_str(ary); - } -} 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 deleted file mode 100644 index 7be3fc44e..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xows_text_tkn.java +++ /dev/null @@ -1,146 +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.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; -import gplx.core.btries.*; import gplx.core.primitives.*; -interface Xows_text_tkn { - int Parse(Xows_text_parser__v2 mgr, byte[] src, int src_end, int tkn_bgn, int tkn_end); -} -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(); - 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; - for (int i = 0; i < len; ++i) { - byte[] itm = ary[i]; - trie.Add_obj(itm, Int_obj_val.new_(itm.length)); - } - } - public int Parse(Xows_text_parser__v2 mgr, byte[] src, int src_end, int tkn_bgn, int tkn_end) { - if (mgr.Bgn__ws() != -1) // pending word - mgr.Word__add(mgr.Bgn__ws(), tkn_bgn); // make word; EX: "B" in "A B C" - mgr.Bgn__ws_clear(); - if (add_sym_as_word) - mgr.Word__add(tkn_bgn, tkn_end); - int rv = tkn_end; - while (rv < src_end) { // skip ws; EX: "a b" - byte b = src[rv]; - Object o = trie.Match_bgn_w_byte(b, src, rv, src_end); - if (o == null) break; - Int_obj_val itm_len = (Int_obj_val)o; - rv += itm_len.Val(); - } - return rv; - } - public boolean Is_word_end(byte[] src, int end, int pos) { - if (pos >= end) return true; - byte b = src[pos]; - Object o = trie.Match_bgn_w_byte(b, src, pos, end); - return o != null; - } - public static Xows_text_tkn__split new_(Btrie_slim_mgr trie, boolean add_sym_as_word, String... str_ary) { - byte[][] bry_ary = Bry_.Ary(str_ary); - Xows_text_tkn__split rv = new Xows_text_tkn__split(add_sym_as_word, bry_ary); - int len = bry_ary.length; - for (int i = 0; i < len; ++i) - trie.Add_obj(bry_ary[i], rv); - return rv; - } -} -class Xows_text_tkn__ellipsis implements Xows_text_tkn { - private final byte ellipsis_byte; - public Xows_text_tkn__ellipsis(byte ellipsis_byte) { - this.ellipsis_byte = ellipsis_byte; - } - public int Parse(Xows_text_parser__v2 mgr, byte[] src, int src_end, int tkn_bgn, int tkn_end) { - int bgn__ws = mgr.Bgn__ws(); - if (bgn__ws != -1) { - mgr.Word__add(bgn__ws, tkn_bgn); // add word; EX: "Dreams" in "Dreams..." - mgr.Bgn__ws_clear(); // clear ws flag, else space will create word; EX: "A... B" - } - int rv = Bry_find_.Find_fwd_while(src, tkn_end, src_end, ellipsis_byte); - mgr.Word__add(tkn_bgn, rv); // add ellipssis - return rv; - } - public static Xows_text_tkn new_(Btrie_slim_mgr trie, String ellipsis) { - byte[] bry = Bry_.new_u8(ellipsis); - Xows_text_tkn rv = new Xows_text_tkn__ellipsis(Bry_.Get_at_end(bry)); - trie.Add_obj(bry, rv); - return rv; - } -} -class Xows_text_tkn__apos implements Xows_text_tkn { - private final byte possessive_byte; - public Xows_text_tkn__apos(byte possessive_byte) {this.possessive_byte = possessive_byte;} - public int Parse(Xows_text_parser__v2 mgr, byte[] src, int src_end, int tkn_bgn, int tkn_end) { - int rv = tkn_end; - byte apos_mode = Apos_contraction; - if (tkn_end == src_end) { // EX: "A'" - apos_mode = Apos_possessive_plural; - rv = src_end; - } - else if (mgr.Ws__is_word_end(tkn_end)) { // EX: "A' " - apos_mode = Apos_possessive_plural; - rv = tkn_end; - } - else if ( src[tkn_end] == possessive_byte // EX: "A's " - && mgr.Ws__is_word_end(tkn_end + 1)) - { - apos_mode = Apos_possessive_singular; - rv = tkn_end + 1; - } - switch (apos_mode) { - case Apos_possessive_plural: - case Apos_possessive_singular: - int word_bgn = mgr.Bgn__ws(); - mgr.Word__add(word_bgn, tkn_bgn); // add noun; EX: "wiki"; - mgr.Word__add(word_bgn, rv); // add full; EX: "wiki's" - mgr.Bgn__ws_clear(); - return rv; - case Apos_contraction: - break; - } - return rv; - } - private static final byte Apos_contraction = 1, Apos_possessive_plural = 2, Apos_possessive_singular = 3; - public static Xows_text_tkn new_(Btrie_slim_mgr trie, String apos, byte possessive_byte) { - byte[] bry = Bry_.new_u8(apos); - Xows_text_tkn rv = new Xows_text_tkn__apos(possessive_byte); - trie.Add_obj(bry, rv); - return rv; - } -} -// class Xows_text_tkn__slash : Xows_text_tkn { -// public int Parse(Xows_text_parser__v2 mgr, byte[] src, int src_end, int tkn_bgn, int tkn_end) { -// int bgn__dash = mgr.Bgn__dash(); -// // add part; -// int part_bgn = mgr.Bgn__dash(); -// if (part_bgn == -1) // no dash -// part_bgn = mgr.Bgn__ws(); -// if (part_bgn != -1) -// mgr.Word__add(part_bgn, tkn_bgn); // add word; EX: "a" in "a-b" -// mgr.Bgn__dash_(tkn_end); -// return tkn_end; -// } -// public static Xows_text_tkn new_(Btrie_slim_mgr trie, String dash) { -// byte[] bry = Bry_.new_u8(dash); -// Xows_text_tkn rv = new Xows_text_tkn__slash(); -// trie.Add_obj(bry, rv); -// return rv; -// } -// } diff --git a/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java b/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java index 7db0d0068..0cad55c63 100644 --- a/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java +++ b/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java @@ -52,7 +52,7 @@ class Xop_statistics_stats_page_grp implements gplx.core.brys.Bfr_arg { byte[] lbl_pages = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_statistics_pages); byte[] lbl_pages_desc = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_statistics_pages_desc); Xol_num_mgr num_mgr = wiki.Lang().Num_mgr(); - fmtr_page.Bld_bfr_many(bfr, lbl_header_pages, lbl_articles, lbl_pages, lbl_pages_desc , num_mgr.Format_num(wiki.Stats().NumArticles()), num_mgr.Format_num(wiki.Stats().NumPages())); + fmtr_page.Bld_bfr_many(bfr, lbl_header_pages, lbl_articles, lbl_pages, lbl_pages_desc , num_mgr.Format_num_by_long(wiki.Stats().Num_articles()), num_mgr.Format_num_by_long(wiki.Stats().Num_pages())); } private Bry_fmtr fmtr_page = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" 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 020d57e4a..4c0060a8d 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 @@ -39,7 +39,7 @@ class Xows_cmd__file_check { atr_main = wiki.File__fsdb_core().File__atr_file__at(Fsm_mnt_mgr.Mnt_idx_main); Write_kv(bfr, "fsdb.atr_file", atr_main.Url()); } catch (Exception e) {bfr.Add_str_u8(Err_.Message_gplx_full(e));} - try {Write_kv(bfr, "fsdb.orig", wiki.File__fsdb_core().File__orig_tbl_ary()[0].Conn().Conn_info().Xto_raw());} catch (Exception e) {bfr.Add_str_u8(Err_.Message_gplx_full(e));} + try {Write_kv(bfr, "fsdb.orig", wiki.File__fsdb_core().File__orig_tbl_ary()[0].Conn().Conn_info().Raw());} catch (Exception e) {bfr.Add_str_u8(Err_.Message_gplx_full(e));} Fsdb_sql_mkr sql_mkr = schema_1 ? Fsdb_sql_mkr__v1.Instance : Fsdb_sql_mkr__v2.Instance; String sql = ""; try { diff --git a/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java b/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java index 6dfe3b46e..a1ca5f05a 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java @@ -28,7 +28,7 @@ public class Popup_history_page implements Xows_page { for (int i = len - 1; i > -1; --i) { Xow_popup_itm itm = (Xow_popup_itm)hash.Get_at(i); if (Ttl_chk(itm.Page_ttl())) continue; - fmtr_main.Bld_bfr_many(bfr, itm.Page_href(), itm.Page_ttl().Full_txt()); + fmtr_main.Bld_bfr_many(bfr, itm.Page_href(), itm.Page_ttl().Full_txt_w_ttl_case()); } page.Data_raw_(bfr.Trim_end(Byte_ascii.Nl).To_bry_and_rls()); page.Html_data().Html_restricted_n_(); diff --git a/400_xowa/src/gplx/xowa/users/Xoc_layout_mgr.java b/400_xowa/src/gplx/xowa/users/Xoc_layout_mgr.java index 2f319eaa5..f63e3f836 100644 --- a/400_xowa/src/gplx/xowa/users/Xoc_layout_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xoc_layout_mgr.java @@ -52,7 +52,7 @@ class Enm_mgr { private Int_obj_ref tmp_val_ref = Int_obj_ref.zero_(); public Enm_mgr Add(byte val, String str) { Int_obj_ref val_ref = Int_obj_ref.new_(val); - KeyVal kv = KeyVal_.new_(str, val_ref); + Keyval kv = Keyval_.new_(str, val_ref); str_hash.Add(str, kv); val_hash.Add(val_ref, kv); return this; @@ -60,14 +60,14 @@ class Enm_mgr { public String Get_str(byte val) { Object o = val_hash.Get_by(tmp_val_ref.Val_(val)); if (o == null) return null; - return ((KeyVal)o).Val_to_str_or_null(); + return ((Keyval)o).Val_to_str_or_null(); } - public KeyVal[] Get_kv_ary() { + public Keyval[] Get_kv_ary() { int len = val_hash.Count(); - KeyVal[] rv = new KeyVal[len]; + Keyval[] rv = new Keyval[len]; for (int i = 0; i < len; i++) { - KeyVal trg = (KeyVal)str_hash.Get_at(i); - rv[i] = KeyVal_.new_(trg.Val_to_str_or_null(), trg.Key()); + Keyval trg = (Keyval)str_hash.Get_at(i); + rv[i] = Keyval_.new_(trg.Val_to_str_or_null(), trg.Key()); } return rv; } diff --git a/400_xowa/src/gplx/xowa/users/Xou_user_tst.java b/400_xowa/src/gplx/xowa/users/Xou_user_tst.java index dba11c959..8797aa291 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user_tst.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user_tst.java @@ -38,7 +38,7 @@ public class Xou_user_tst { } } class Xou_user_fxt { - public Xoae_app App() {return app;} private Xoae_app app = Xoa_app_fxt.app_(); + public Xoae_app App() {return app;} private Xoae_app app = Xoa_app_fxt.Make__app__edit(); public String Make_xwiki(boolean offline, String name) {return String_.Concat_with_str("|", Yn.To_str(offline), name);} public void Test_fil(Io_url url, String expd) { Tfds.Eq_str_lines(expd, Io_mgr.Instance.LoadFilStr(url)); diff --git a/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java b/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java index 409e25266..990f269bf 100644 --- a/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java @@ -39,7 +39,7 @@ public class Xouc_window_mgr implements GfoInvkAble { } public static final String Invk_mode = "mode", Invk_mode_ = "mode_", Invk_mode_list = "mode_list" , Invk_rect = "rect", Invk_rect_ = "rect_", Invk_safe_mode = "safe_mode", Invk_safe_mode_ = "safe_mode_", Invk_previous_adj = "previous_adj", Invk_previous_adj_ = "previous_adj_"; - private static KeyVal[] Options_mode_list = KeyVal_.Ary(KeyVal_.new_("previous"), KeyVal_.new_("maximized"), KeyVal_.new_("absolute"), KeyVal_.new_("relative"), KeyVal_.new_("default")); + private static Keyval[] Options_mode_list = Keyval_.Ary(Keyval_.new_("previous"), Keyval_.new_("maximized"), Keyval_.new_("absolute"), Keyval_.new_("relative"), Keyval_.new_("default")); public void Init_window(GfuiWin win) { boolean init_is_maximized = false; switch (mode_tid) { diff --git a/400_xowa/src/gplx/xowa/users/Xoue_user.java b/400_xowa/src/gplx/xowa/users/Xoue_user.java index 97a34071b..af0ac358e 100644 --- a/400_xowa/src/gplx/xowa/users/Xoue_user.java +++ b/400_xowa/src/gplx/xowa/users/Xoue_user.java @@ -33,12 +33,12 @@ public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble { this.cfg_mgr = new Xou_cfg(this); this.session_mgr = new Xou_session(this); } - public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr; + 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 Xou_db_mgr User_db_mgr() {return user_db_mgr;} private final Xou_db_mgr user_db_mgr; 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 Xoae_app Appe() {return app;} private final Xoae_app app; public Xol_lang_itm Lang() {if (lang == null) {lang = app.Lang_mgr().Get_by_or_new(app.Sys_cfg().Lang()); lang.Init_by_load();} return lang;} private Xol_lang_itm lang; public void Lang_(Xol_lang_itm v) { lang = v; @@ -109,12 +109,10 @@ public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble { for (int i = 0; i < dirs_len; i++) { Io_url dir = dirs[i]; String name = dir.NameOnly(); - if (String_.Eq(name, gplx.xowa.bldrs.cmds.utils.Xob_core_batch_utl.Dir_dump) -// || !Io_mgr.Instance.ExistsDir(dir.GenSubFil_nest("ns")) - ) continue; + if (String_.Eq(name, gplx.xowa.bldrs.cmds.utils.Xob_core_batch_utl.Dir_dump)) continue; // ignore "#dump" byte[] dir_name_as_bry = Bry_.new_u8(name); Xow_xwiki_itm xwiki = Available_add(usr_wiki, dir_name_as_bry); - if (xwiki != null) // Add_full can return null if adding invalid lang; should not apply here, but guard against null ref + if (xwiki != null) // Add_full can return null if adding invalid lang; should not apply here, but guard against null ref xwiki.Offline_(true); // mark xwiki as offline; needed for available wikis sidebar; DATE:2014-09-21 app.Setup_mgr().Maint_mgr().Wiki_mgr().Add(dir_name_as_bry); } diff --git a/400_xowa/src/gplx/xowa/users/bmks/Dbui_tbl_itm__bmk.java b/400_xowa/src/gplx/xowa/users/bmks/Dbui_tbl_itm__bmk.java index 22a28b7c0..9c29b768d 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Dbui_tbl_itm__bmk.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Dbui_tbl_itm__bmk.java @@ -21,13 +21,13 @@ import gplx.langs.jsons.*; import gplx.langs.htmls.*; import gplx.xowa.users.data.*; import gplx.xowa.users.bmks.*; import gplx.xowa.htmls.bridges.*; import gplx.xowa.htmls.bridges.dbuis.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.htmls.bridges.dbuis.fmtrs.*; public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { - private final Xoa_app app; private final Xoud_bmk_itm_tbl tbl; - private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); - private final Dbui_cells_fmtr cells_fmtr = new Dbui_cells_fmtr(); private final Dbui_val_fmtr edit_val_fmtr = Dbui_val_fmtr_.new_edit(); private final Dbui_val_fmtr view_val_fmtr = Dbui_val_fmtr_.new_view(); - private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); - private final Bridge_msg_bldr msg_bldr; + private final Xoa_app app; private final Xoud_bmk_itm_tbl tbl; + private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); + private final Dbui_cells_fmtr cells_fmtr = new Dbui_cells_fmtr(); private final Dbui_val_fmtr edit_val_fmtr = Dbui_val_fmtr_.new_edit(); private final Dbui_val_fmtr view_val_fmtr = Dbui_val_fmtr_.new_view(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private final Bridge_msg_bldr msg_bldr; public Dbui_tbl_itm__bmk(Xoa_app app, Xoud_bmk_itm_tbl tbl) {this.app = app; this.tbl = tbl; this.msg_bldr = app.Html__bridge_mgr().Msg_bldr();} - public byte[] Key() {return key;} private static final byte[] key = Bry_.new_a7("bmk"); + public byte[] Key() {return key;} private static final byte[] key = Bry_.new_a7("bmk"); public Dbui_btn_itm[] View_btns() {return view_btns;} public Dbui_btn_itm[] Edit_btns() {return edit_btns;} public Dbui_col_itm[] Cols() {return cols;} @@ -38,10 +38,10 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { } public void Select(Bry_bfr bfr, int owner) { Xoud_bmk_itm_row[] db_rows = tbl.Select_grp(owner); - byte[] option_link = app.Html__lnki_bldr().Href_(Bry_.new_a7("home"), app.User().Wikii().Ttl_parse(Bry_.new_a7("Help:Options/Bookmarks"))).Img_16x16(gplx.xowa.htmls.core.htmls.utls.Xoh_img_path.Img_option).Bld_to_bry(); + byte[] option_link = app.Html__lnki_bldr().Href_(Bry_.new_a7("home"), app.User().Wikii().Ttl_parse(Bry_.new_a7("Options/Bookmarks"))).Img_16x16(gplx.xowa.htmls.core.htmls.utls.Xoh_img_path.Img_option).Bld_to_bry();// HOME byte[] delete_confirm_msg = app.Api_root().Usr().Bookmarks().Delete_confirm() ? Msg__delete_confirm : Bry_.Empty; tbl_fmtr.Write(bfr, this, option_link, delete_confirm_msg, To_ui_rows(db_rows)); - } private static final byte[] Msg__delete_confirm = Bry_.new_a7(" data-dbui-delete_confirm_msg='Are you sure you want to delete this bookmark?'"); + } private static final byte[] Msg__delete_confirm = Bry_.new_a7(" data-dbui-delete_confirm_msg='Are you sure you want to delete this bookmark?'"); public String Del(byte[] row_id, byte[] row_pkey) { Xoud_bmk_itm_row db_row = Get_db_row(row_pkey); if (db_row == null) return Fail_missing_row(row_pkey); tbl.Delete(db_row.Id()); @@ -102,20 +102,20 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { private String Fail_missing_row(byte[] row_pkey) { return msg_bldr.Clear().Notify_fail_(Err_msg.To_str("Item has been deleted", "key", row_pkey)).Notify_hint_("Please reload the page").To_json_str(); } - private static final Dbui_col_itm[] cols = new Dbui_col_itm[] + private static final Dbui_col_itm[] cols = new Dbui_col_itm[] { new Dbui_col_itm(Dbui_col_itm.Type_id_str , 150, "name" , "Name") , new Dbui_col_itm(Dbui_col_itm.Type_id_str , 300, "url" , "Url") , new Dbui_col_itm(Dbui_col_itm.Type_id_text , 300, "comment" , "Comment") }; - private static final Dbui_btn_itm[] view_btns = new Dbui_btn_itm[] + private static final Dbui_btn_itm[] view_btns = new Dbui_btn_itm[] { new Dbui_btn_itm("rows__edit" , "edit.png" , "edit") , new Dbui_btn_itm("rows__delete" , "delete.png" , "delete") }; - private static final Dbui_btn_itm[] edit_btns = new Dbui_btn_itm[] + private static final Dbui_btn_itm[] edit_btns = new Dbui_btn_itm[] { new Dbui_btn_itm("rows__save" , "save.png" , "save") , new Dbui_btn_itm("rows__cancel" , "cancel.png" , "cancel") }; - private static final Bry_fmtr url_fmtr = Bry_fmtr.new_("~{url}", "url"); + private static final Bry_fmtr url_fmtr = Bry_fmtr.new_("~{url}", "url"); public static Dbui_tbl_itm__bmk get_or_new(Xoa_app app, Xoud_bmk_itm_tbl db_tbl) { if (I == null) { I = new Dbui_tbl_itm__bmk(app, db_tbl); diff --git a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java index 757d47c03..5cb6c65e4 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java @@ -30,7 +30,7 @@ public class Xoud_bmk_dir_tbl implements Rls_able { } public Db_conn Conn() {return conn;} private final Db_conn conn; public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary()));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary()));} public void Insert(int owner, int sort, byte[] name) { Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java index ed47bdda7..41988f0af 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java @@ -34,7 +34,7 @@ public class Xoud_bmk_itm_tbl implements Rls_able { } public Db_conn Conn() {return conn;} private final Db_conn conn; public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary()));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary()));} public void Insert(int owner, int sort, byte[] name, byte[] wiki, byte[] url, byte[] comment) { Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java index da46395f7..1f9c9e1f3 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java +++ b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java @@ -38,4 +38,4 @@ public class Xou_db_file { tbl__cache.Create_tbl(); } } -} \ No newline at end of file +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java index 368af885e..4bacf52a4 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java @@ -35,7 +35,7 @@ public class Xoud_regy_tbl { if (created) { Schema_update_cmd cmd = Schema_update_cmd_.Make_tbl_create(Xoud_regy_tbl.Tbl_name , Xoud_regy_tbl.Tbl_sql , Xoud_regy_tbl.Idx_core); cmd.Exec(null, conn); -// conn.Ddl_create_tbl(meta); +// conn.Meta_tbl_create(meta); } return this; } private Db_conn conn; diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java index 8b03fc8d6..c1c16575b 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java @@ -31,7 +31,7 @@ public class Xoud_site_tbl implements Rls_able { fld_site_xtn = flds.Add_text("site_xtn"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Rls() {} public void Insert(int site_id, int priority, String domain, String name, String path, String xtn) { Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java index ac0b99c5b..44a35d473 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java @@ -41,7 +41,7 @@ class Xoud_user_tbl { Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "name", fld_name) ); - conn.Ddl_create_tbl(meta); + conn.Meta_tbl_create(meta); } } public void Insert(int id, String name) { diff --git a/400_xowa/src/gplx/xowa/users/history/Dbui_tbl_itm__history.java b/400_xowa/src/gplx/xowa/users/history/Dbui_tbl_itm__history.java index c72eb66e4..2e0037452 100644 --- a/400_xowa/src/gplx/xowa/users/history/Dbui_tbl_itm__history.java +++ b/400_xowa/src/gplx/xowa/users/history/Dbui_tbl_itm__history.java @@ -21,12 +21,12 @@ import gplx.langs.jsons.*; import gplx.langs.htmls.*; import gplx.xowa.users.data.*; import gplx.xowa.users.bmks.*; import gplx.xowa.htmls.bridges.*; import gplx.xowa.htmls.bridges.dbuis.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.htmls.bridges.dbuis.fmtrs.*; public class Dbui_tbl_itm__history implements Dbui_tbl_itm { - private final Xoa_app app; private final Xoud_history_tbl tbl; - private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); - private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); - private final Bridge_msg_bldr msg_bldr; + private final Xoa_app app; private final Xoud_history_tbl tbl; + private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private final Bridge_msg_bldr msg_bldr; public Dbui_tbl_itm__history(Xoa_app app, Xoud_history_tbl tbl) {this.app = app; this.tbl = tbl; this.msg_bldr = app.Html__bridge_mgr().Msg_bldr();} - public byte[] Key() {return key;} private static final byte[] key = Bry_.new_a7("history"); + public byte[] Key() {return key;} private static final byte[] key = Bry_.new_a7("history"); public Dbui_btn_itm[] View_btns() {return view_btns;} public Dbui_btn_itm[] Edit_btns() {return Dbui_btn_itm.Ary_empty;} public Dbui_col_itm[] Cols() {return cols;} @@ -35,14 +35,14 @@ public class Dbui_tbl_itm__history implements Dbui_tbl_itm { dbui_mgr.Init_by_bridge(bridge_mgr); dbui_mgr.Add(this); } - private final List_adp select_list = List_adp_.new_(); + private final List_adp select_list = List_adp_.new_(); public void Select(Bry_bfr bfr, int top) { tbl.Select_by_top(select_list, 100); Xoud_history_row[] db_rows = (Xoud_history_row[])select_list.To_ary_and_clear(Xoud_history_row.class); - byte[] option_link = app.Html__lnki_bldr().Href_(Bry_.new_a7("home"), app.User().Wikii().Ttl_parse(Bry_.new_a7("Help:Options/PageHistory"))).Img_16x16(gplx.xowa.htmls.core.htmls.utls.Xoh_img_path.Img_option).Bld_to_bry(); + byte[] option_link = app.Html__lnki_bldr().Href_(Bry_.new_a7("home"), app.User().Wikii().Ttl_parse(Bry_.new_a7("Options/PageHistory"))).Img_16x16(gplx.xowa.htmls.core.htmls.utls.Xoh_img_path.Img_option).Bld_to_bry();// HOME byte[] delete_confirm_msg = app.Api_root().Usr().Bookmarks().Delete_confirm() ? Msg__delete_confirm : Bry_.Empty; tbl_fmtr.Write(bfr, this, option_link, delete_confirm_msg, To_ui_rows(db_rows)); - } private static final byte[] Msg__delete_confirm = Bry_.new_a7(" data-dbui-delete_confirm_msg='Are you sure you want to delete this row?'"); + } private static final byte[] Msg__delete_confirm = Bry_.new_a7(" data-dbui-delete_confirm_msg='Are you sure you want to delete this row?'"); public String Del(byte[] row_id, byte[] row_pkey) { Xoud_history_row db_row = Get_db_row(row_pkey); if (db_row == null) return Fail_missing_row(row_pkey); tbl.Delete(db_row.Id()); @@ -76,16 +76,16 @@ public class Dbui_tbl_itm__history implements Dbui_tbl_itm { private String Fail_missing_row(byte[] row_pkey) { return msg_bldr.Clear().Notify_fail_(Err_msg.To_str("Item has been deleted", "key", row_pkey)).Notify_hint_("Please reload the page").To_json_str(); } - private static final Dbui_col_itm[] cols = new Dbui_col_itm[] + private static final Dbui_col_itm[] cols = new Dbui_col_itm[] { new Dbui_col_itm(Dbui_col_itm.Type_id_str , 300, "page" , "Page") , new Dbui_col_itm(Dbui_col_itm.Type_id_str , 150, "wiki" , "Wiki") , new Dbui_col_itm(Dbui_col_itm.Type_id_int , 80, "views" , "Views") , new Dbui_col_itm(Dbui_col_itm.Type_id_datetime, 100, "time" , "Time") }; - private static final Dbui_btn_itm[] view_btns = new Dbui_btn_itm[] + private static final Dbui_btn_itm[] view_btns = new Dbui_btn_itm[] { new Dbui_btn_itm("rows__delete" , "delete.png" , "delete") }; - private static final Bry_fmtr url_fmtr = Bry_fmtr.new_("~{url}", "url"); + private static final Bry_fmtr url_fmtr = Bry_fmtr.new_("~{url}", "url"); public static Dbui_tbl_itm__history get_or_new(Xoa_app app, Xoud_history_tbl db_tbl) { if (I == null) { I = new Dbui_tbl_itm__history(app, db_tbl); 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 70499174d..bf259d0ec 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 @@ -48,8 +48,8 @@ class Xou_history_mgr_fxt { Xou_history_mgr under; public void Clear() { if (app == null) { - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(app); + app = Xoa_app_fxt.Make__app__edit(); + wiki = Xoa_app_fxt.Make__wiki__edit(app); under = app.Usere().History_mgr(); } Io_mgr.Instance.DeleteDirDeep(Io_url_.new_dir_("mem/xowa/user/test_user/app/data/history/")); diff --git a/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java b/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java index 0acdc2dc2..355065350 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java +++ b/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java @@ -32,7 +32,7 @@ public class Xoud_history_tbl implements Rls_able { conn.Rls_reg(this); } public String Tbl_name() {return tbl_name;} - public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_wiki, fld_url)));} + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_wiki, fld_url)));} public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); stmt_update = Db_stmt_.Rls(stmt_update); diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_converter.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_converter.java index 2a04cc8c8..79a4c4f11 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_converter.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_converter.java @@ -95,7 +95,7 @@ public class Prefs_converter { bfr.Add_byte(Byte_ascii.Paren_bgn); for (int i = 0; i < args_count; i++) { if (i != 0) bfr.Add_byte(Byte_ascii.Comma); - KeyVal kv = m.Args_getAt(i); + Keyval kv = m.Args_getAt(i); bfr.Add_byte(Byte_ascii.Quote); bfr.Add_str_u8(kv.Val_to_str_or_empty()); bfr.Add_byte(Byte_ascii.Quote); diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java index 951a9b16b..217ab478b 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java @@ -51,13 +51,13 @@ class Prefs_html_wtr { Write__nde_end(bfr); // ">" } private void Write_select(Bry_bfr bfr, Gfh_nde hnde, int prop_idx, Object prop_val) { - KeyVal[] options_list = Get_select_options(hnde); + Keyval[] options_list = Get_select_options(hnde); Write__id(bfr, prop_idx); // " id='xowa_prop_123'" Write__nde_end(bfr); // ">" bfr.Add_byte_nl(); // "\n" int len = options_list.length; for (int i = 0; i < len; i++) { - KeyVal option = options_list[i]; + Keyval option = options_list[i]; bfr.Add(Nde_stub_option_bgn); // "