diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index 7bd57c004..df3f3287a 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -409,7 +409,9 @@ public class Bry_ { } return trimmed ? Bry_.Mid(v, 0, pos + 1) : v; } + public static boolean Has(byte[] src, byte[] lkp) {return Bry_finder.Find_fwd(src, lkp) != Bry_finder.Not_found;} public static boolean Has(byte[] src, byte lkp) { + if (src == null) return false; int len = src.length; for (int i = 0; i < len; i++) if (src[i] == lkp) return true; diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 0d7b57691..6cbbcaba9 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -257,22 +257,23 @@ public class Bry_bfr { return this; } public Bry_bfr Add_bry_escape_by_doubling(byte quote_byte, byte[] val) {return Add_bry_escape(quote_byte, quote_byte, val, 0, val.length);} - public Bry_bfr Add_bry_escape(byte quote_byte, byte escape_byte, byte[] val, int bgn, int end) { - boolean clean = true; - for (int i = bgn; i < end; i++) { + public Bry_bfr Add_bry_escape(byte quote_byte, byte escape_byte, byte[] val, int bgn, int end) {return Add_bry_escape(quote_byte, new byte[] {escape_byte}, val, bgn, end);} + public Bry_bfr Add_bry_escape(byte quote_byte, byte[] escape, byte[] val, int bgn, int end) { // used for xml_wtr; DATE:2015-04-09 + boolean clean = true; // add with chunks of bytes instead of one-by-one + for (int i = bgn; i < end; ++i) { byte b = val[i]; if (clean) { if (b == quote_byte) { clean = false; this.Add_mid(val, bgn, i); - this.Add_byte(escape_byte); + this.Add(escape); this.Add_byte(quote_byte); } else {} } else { if (b == quote_byte) - this.Add_byte(escape_byte); + this.Add(escape); this.Add_byte(b); } } diff --git a/100_core/src_110_primitive/gplx/Bry_fmtr_arg_.java b/100_core/src_110_primitive/gplx/Bry_fmtr_arg_.java index 1417d1530..d424e244e 100644 --- a/100_core/src_110_primitive/gplx/Bry_fmtr_arg_.java +++ b/100_core/src_110_primitive/gplx/Bry_fmtr_arg_.java @@ -26,8 +26,8 @@ public class Bry_fmtr_arg_ { public static Bry_fmtr_arg_bfr_preserve bfr_retain_(Bry_bfr v) {return new Bry_fmtr_arg_bfr_preserve(v);} public static Bry_fmtr_arg fmtr_(Bry_fmtr v, Bry_fmtr_arg... arg_ary) {return new Bry_fmtr_arg_fmtr(v, arg_ary);} public static Bry_fmtr_arg_fmtr_objs fmtr_null_() {return new Bry_fmtr_arg_fmtr_objs(null, null);} - public static final Bry_fmtr_arg Null = new Bry_fmtr_arg_null(); + public static final Bry_fmtr_arg Noop = new Bry_fmtr_arg__noop(); } -class Bry_fmtr_arg_null implements Bry_fmtr_arg { +class Bry_fmtr_arg__noop implements Bry_fmtr_arg { public void XferAry(Bry_bfr trg, int idx) {} } diff --git a/100_core/src_110_primitive/gplx/Bry_fmtr_vals.java b/100_core/src_110_primitive/gplx/Bry_fmtr_vals.java new file mode 100644 index 000000000..58f8d516b --- /dev/null +++ b/100_core/src_110_primitive/gplx/Bry_fmtr_vals.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; +public class Bry_fmtr_vals implements Bry_fmtr_arg { + private final Bry_fmtr fmtr; private Object[] vals; + Bry_fmtr_vals(Bry_fmtr fmtr) {this.fmtr = fmtr;} + public Bry_fmtr_vals Vals_(Object... v) {this.vals = v; return this;} + public void XferAry(Bry_bfr bfr, int idx) { + fmtr.Bld_bfr_ary(bfr, vals); + } + public static Bry_fmtr_vals new_fmt(String fmt, String... keys) { + Bry_fmtr fmtr = Bry_fmtr.new_(fmt, keys); + return new Bry_fmtr_vals(fmtr); + } + public static Bry_fmtr_vals new_(Bry_fmtr fmtr) {return new Bry_fmtr_vals(fmtr);} +} diff --git a/100_core/src_110_primitive/gplx/Byte_ascii.java b/100_core/src_110_primitive/gplx/Byte_ascii.java index 47c25ca17..2f5c7c19f 100644 --- a/100_core/src_110_primitive/gplx/Byte_ascii.java +++ b/100_core/src_110_primitive/gplx/Byte_ascii.java @@ -41,6 +41,9 @@ public class Byte_ascii { , Ltr_x = 120, Ltr_y = 121, Ltr_z = 122, Curly_bgn = 123, Pipe = 124 , Curly_end = 125, Tilde = 126 ; + public static final byte + Angle_bgn = Lt, Angle_end = Gt + ; public static final byte Max_7_bit = (byte)127, Ascii_min = 0, Ascii_max = 127; public static boolean Is_sym(byte b) { switch (b) { diff --git a/100_core/src_110_primitive/gplx/Double_.java b/100_core/src_110_primitive/gplx/Double_.java index a692098f4..4d7b2587a 100644 --- a/100_core/src_110_primitive/gplx/Double_.java +++ b/100_core/src_110_primitive/gplx/Double_.java @@ -20,11 +20,14 @@ public class Double_ { public static final String Cls_val_name = "double"; public static final Class Cls_ref_type = Double.class; public static final double - MinValue = Double.MIN_VALUE - , NaN = Double.NaN - , Inf_pos = Double.POSITIVE_INFINITY + MinValue = Double.MIN_VALUE + , NaN = Double.NaN + , Inf_pos = Double.POSITIVE_INFINITY + ; + public static final byte[] + NaN_bry = Bry_.new_ascii_("NaN") + , Inf_pos_bry = Bry_.new_ascii_("INF") ; - public static final byte[] NaN_bry = Bry_.new_ascii_("NaN"); public static boolean IsNaN(double v) {return Double.isNaN(v);} public static double cast_(Object o) {try {return (Double)o;} catch(Exception e) {throw Err_.type_mismatch_exc_(e, double.class, o);}} public static double parse_(String raw) {try {return Double.parseDouble(raw);} catch(Exception e) {throw Err_.parse_type_exc_(e, double.class, raw);}} diff --git a/100_core/src_120_basicDataType/gplx/DecimalAdp.java b/100_core/src_120_basicDataType/gplx/DecimalAdp.java index 3e13c6c07..c0d528a50 100644 --- a/100_core/src_120_basicDataType/gplx/DecimalAdp.java +++ b/100_core/src_120_basicDataType/gplx/DecimalAdp.java @@ -27,9 +27,12 @@ public class DecimalAdp implements CompareAble { protected DecimalAdp(int v) {this.under = new BigDecimal(v);} public String Xto_str() { BigDecimal tmp = under; - if (tmp.scale() > 14) tmp = tmp.setScale(14, RoundingMode.DOWN); // NOTE: setting to 14 to match PHP/C# values more closely; RoundingMode.Down for same reason; see E, Pi tests - return tmp .stripTrailingZeros() // NOTE: stripTrailingZeros for exp tests; EX: 120.0 -> 120; 0.01200000000000 -> .012 - .toPlainString(); // NOTE: toPlainString b/c stripTrailingZeros now converts 120 to 1.2E+2 (and any other value that is a multiple of 10) + int tmp_scale = tmp.scale(); + if (tmp_scale <= -14) return tmp.toString(); // NOTE: if large number, call .toString which will return exponential notaion (1E##) instead of literal (1000....); 14 matches MW code; DATE:2015-04-10 + if (tmp_scale > 14) + tmp = tmp.setScale(14, RoundingMode.DOWN); // NOTE: if small number, round down to remove excessive zeroes; 14 matches PHP/C# values more closely; RoundingMode.Down for same reason; see E, Pi tests + return tmp .stripTrailingZeros() // NOTE: stripTrailingZeros for exp tests; EX: 120.0 -> 120; 0.01200000000000 -> .012 + .toPlainString(); // NOTE: toPlainString b/c stripTrailingZeros now converts 120 to 1.2E+2 (and any other value that is a multiple of 10) } public String Xto_str(String fmt) {return new DecimalFormat(fmt).format(under);} @Override public String toString() {return under.toString();} diff --git a/100_core/src_140_list/gplx/ListAdp_.java b/100_core/src_140_list/gplx/ListAdp_.java index ca5ed2a4a..cfb3bbda2 100644 --- a/100_core/src_140_list/gplx/ListAdp_.java +++ b/100_core/src_140_list/gplx/ListAdp_.java @@ -23,6 +23,11 @@ public class ListAdp_ { public static ListAdp size_(int v) {return new ListAdp_obj(v);} public static ListAdp many_(Object... ary) {return new ListAdp_obj().AddMany(ary);} public static final ListAdp Null = new ListAdp_null(); + public static void Add_list(ListAdp rv, ListAdp add) { + int len = add.Count(); + for (int i = 0; i < len; ++i) + rv.Add(add.FetchAt(i)); + } public static void DelAt_last(ListAdp list) {list.DelAt(list.Count() - 1);} public static Object Pop(ListAdp list) { int lastIdx = list.Count() - 1; diff --git a/100_core/src_210_env/gplx/threads/ThreadAdp_.java b/100_core/src_210_env/gplx/threads/ThreadAdp_.java index 6d4719e6d..131d7e1f7 100644 --- a/100_core/src_210_env/gplx/threads/ThreadAdp_.java +++ b/100_core/src_210_env/gplx/threads/ThreadAdp_.java @@ -19,6 +19,11 @@ package gplx.threads; import gplx.*; public class ThreadAdp_ { public static void Sleep(int milliseconds) { try {Thread.sleep(milliseconds);} catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.Thread", "thread interrupted").Add("milliseconds", milliseconds);} + } + public static void Notify_all(Object o) {o.notifyAll();} + public static void Wait(Object o) { + try {o.wait();} + catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.Thread", "thread wait");} } public static ThreadAdp invk_(GfoInvkAble invk, String cmd) {return invk_(Name_null, invk, cmd);} public static ThreadAdp invk_(String name, GfoInvkAble invk, String cmd) {return new ThreadAdp(name, invk, cmd, GfoMsg_.Null);} diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index db17d9000..a534f1319 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -59,11 +59,11 @@ public class Db_conn { 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_.I.Plog_many("", "", "bgn: " + msg); + Gfo_usr_dlg_.I.Plog_many("", "", msg); if (txn) this.Txn_bgn(); int rv = Exec_sql(sql); if (txn) this.Txn_end(); - Gfo_usr_dlg_.I.Plog_many("", "", "end: " + msg); + Gfo_usr_dlg_.I.Plog_many("", "", "done:" + msg); return rv; } public int Exec_qry(Db_qry qry) {return Int_.cast_(engine.Exec_as_obj(qry));} diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld.java b/140_dbs/src/gplx/dbs/Db_meta_fld.java index f062f512f..127a9b87b 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_fld.java +++ b/140_dbs/src/gplx/dbs/Db_meta_fld.java @@ -30,6 +30,7 @@ public class Db_meta_fld { public Object Default_value() {return default_value;} private final Object default_value; public static final int Tid_bool = 0, Tid_byte = 1, Tid_short = 2, Tid_int = 3, Tid_long = 4, Tid_float = 5, Tid_double = 6, Tid_str = 7, Tid_text = 8, Tid_bry = 9; public static final String Key_null = null; + public static final int Len_null = -1; public static final String[] Ary_empy = String_.Ary_empty; public static final Object Default_value_null = null; } diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java index 315fbf6bb..46aaf16dc 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java +++ b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java @@ -50,6 +50,7 @@ public class Db_meta_fld_list { } return rv.XtoStrAry(); } + public boolean Has(String key) {return flds.Has(key);} public String Add_bool(String name) {return Add(name, Db_meta_fld.Tid_bool, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_byte(String name) {return Add(name, Db_meta_fld.Tid_byte, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_short(String name) {return Add(name, Db_meta_fld.Tid_short, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} @@ -70,10 +71,14 @@ public class Db_meta_fld_list { public String Add_bry(String name) {return Add(name, Db_meta_fld.Tid_bry, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add(String name, int tid, int len, boolean nullable, boolean primary, boolean autoincrement, Object default_value) { Db_meta_fld fld = new Db_meta_fld(name, tid, len, nullable, primary, autoincrement, default_value); - flds.Add(name, fld); - keys.Add(name); + Add_itm(fld); return name; } - private static final int Len_null = -1; + public void Add_itm(Db_meta_fld fld) { + String name = fld.Name(); + flds.Add(name, fld); + keys.Add(name); + } + private static final int Len_null = Db_meta_fld.Len_null; public static Db_meta_fld_list new_() {return new Db_meta_fld_list();} } 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 cd6dfc59a..7e35f3f2e 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 @@ -61,7 +61,16 @@ public abstract class Db_engine_sql_base implements Db_engine { Exec_as_int(idx.To_sql_create()); } } - public void Ddl_append_fld(String tbl, Db_meta_fld fld) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld));} + public void Ddl_append_fld(String tbl, Db_meta_fld fld) { + Gfo_usr_dlg_.I.Plog_many("", "", "adding column to table: db=~{0} tbl=~{1} fld=~{2}", conn_info.Database(), tbl, fld.Name()); + try { + Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld)); + Gfo_usr_dlg_.I.Plog_many("", "", "column added to table: db=~{0} tbl=~{1} fld=~{2}", conn_info.Database(), tbl, fld.Name()); + } + catch (Exception e) { // catch error if column already added to table + Gfo_usr_dlg_.I.Warn_many("", "", "column not added to table: db=~{0} tbl=~{1} fld=~{2} err=~{3}", conn_info.Database(), tbl, fld.Name(), Err_.Message_gplx(e)); + } + } public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_drop_tbl(tbl));} @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} @gplx.Virtual public void Env_db_detach(String alias) {} 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 eedeb36f9..5bc6001e0 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java @@ -114,7 +114,7 @@ public class Db_stmt_cmd implements Db_stmt { catch (Exception e) { this.Rls(); Reset_stmt(); - throw Err_.err_(e, "db_stmt.insert: url={0} sql={1} err={2}", engine.Conn_info(), sql, Err_.Message_gplx_brief(e)); + throw Err_.err_(e, "db_stmt.insert: url={0} sql={1} err={2}", engine.Conn_info().Xto_api(), sql, Err_.Message_gplx_brief(e)); } } public int Exec_update() { diff --git a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java index 829c717e0..585e8f73e 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java +++ b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java @@ -34,6 +34,7 @@ public interface Gxw_html extends GxwElem { boolean Html_elem_atr_set_append(String id, String atr_key, String append); boolean Html_elem_delete(String id); boolean Html_elem_replace_html(String id, String html); + boolean Html_elem_append_above(String id, String html); boolean Html_gallery_packed_exec(); boolean Html_elem_focus(String id); boolean Html_elem_scroll_into_view(String id); 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 0f1b91102..a94db326e 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 @@ -36,6 +36,7 @@ public class Gfui_html extends GfuiElemBase { public boolean Html_elem_atr_set_append(String elem_id, String atr_key, String append) {return under.Html_elem_atr_set_append(elem_id, atr_key, append);} public boolean Html_elem_delete(String elem_id) {return under.Html_elem_delete(elem_id);} public boolean Html_elem_replace_html(String id, String html) {return under.Html_elem_replace_html(id, html);} + public boolean Html_elem_append_above(String id, String html) {return under.Html_elem_append_above(id, html);} public boolean Html_gallery_packed_exec() {return under.Html_gallery_packed_exec();} public void Html_elem_focus(String elem_id) {under.Html_elem_focus(elem_id);} public boolean Html_elem_scroll_into_view(String elem_id) {return under.Html_elem_scroll_into_view(elem_id);} diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java index cfb193691..5e8f5ff61 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java @@ -39,6 +39,7 @@ public class Gfui_html_cfg implements GfoInvkAble { } private Bry_fmtr fmtr_elem_atr_set_append = Bry_fmtr.keys_("elem_id", "atr_key", "atr_val"); public String Elem_delete(String elem_id) {return Exec_fmt(fmtr_elem_delete, elem_id);} private Bry_fmtr fmtr_elem_delete = Bry_fmtr.keys_("elem_id"); public String Elem_replace_html(String id, String html) {return Exec_fmt(fmtr_elem_replace_html, id, Escape_quote(html));} private Bry_fmtr fmtr_elem_replace_html = Bry_fmtr.keys_("id", "html"); + public String Elem_append_above(String id, String html) {return Exec_fmt(fmtr_elem_append_above, id, Escape_quote(html));} private Bry_fmtr fmtr_elem_append_above = Bry_fmtr.keys_("id", "html"); public String Gallery_packed_exec() {return Exec_fmt(fmtr_gallery_packed_exec);} private Bry_fmtr fmtr_gallery_packed_exec = Bry_fmtr.keys_(); public String Elem_focus(String elem_id) {return Exec_fmt(fmtr_elem_focus, elem_id);} private Bry_fmtr fmtr_elem_focus = Bry_fmtr.keys_("elem_id"); public String Elem_scroll_into_view(String elem_id) {return Exec_fmt(fmtr_elem_scroll_into_view, elem_id);} private Bry_fmtr fmtr_elem_scroll_into_view = Bry_fmtr.keys_("elem_id"); @@ -79,6 +80,7 @@ public class Gfui_html_cfg implements GfoInvkAble { else if (ctx.Match(k, Invk_elem_atr_set_append_)) fmtr_elem_atr_set_append.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_delete_)) fmtr_elem_delete.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_replace_html_)) fmtr_elem_replace_html.Fmt_(m.ReadBry("v")); + else if (ctx.Match(k, Invk_elem_append_above_)) fmtr_elem_append_above.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_gallery_packed_exec_)) fmtr_gallery_packed_exec.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_focus_)) fmtr_elem_focus.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_scroll_into_view_)) fmtr_elem_scroll_into_view.Fmt_(m.ReadBry("v")); @@ -107,7 +109,7 @@ public class Gfui_html_cfg implements GfoInvkAble { , Invk_elem_atr_get_ = "elem_atr_get_", Invk_elem_atr_get_toString_ = "elem_atr_get_toString_", Invk_elem_atr_set_ = "elem_atr_set_", Invk_elem_atr_set_append_ = "elem_atr_set_append_" , Invk_elem_path_get_ = "elem_path_get_", Invk_elem_path_set_ = "elem_path_set_" , Invk_elem_focus_ = "elem_focus_", Invk_elem_scroll_into_view_ = "elem_scroll_into_view_" - , Invk_elem_img_update_ = "elem_img_update_", Invk_elem_delete_ = "elem_delete_", Invk_elem_replace_html_ = "elem_replace_html_", Invk_gallery_packed_exec_ = "gallery_packed_exec_" + , Invk_elem_img_update_ = "elem_img_update_", Invk_elem_delete_ = "elem_delete_", Invk_elem_replace_html_ = "elem_replace_html_", Invk_elem_append_above_ = "elem_append_above_", Invk_gallery_packed_exec_ = "gallery_packed_exec_" , Invk_js_scripts_add = "js_scripts_add" , Invk_javascript_enabled_ = "javascript_enabled_" ; diff --git a/150_gfui/src_700_env/gplx/gfui/Mem_html.java b/150_gfui/src_700_env/gplx/gfui/Mem_html.java index 94d5d3118..8ee1ce4e1 100644 --- a/150_gfui/src_700_env/gplx/gfui/Mem_html.java +++ b/150_gfui/src_700_env/gplx/gfui/Mem_html.java @@ -76,6 +76,7 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Htm public boolean Html_elem_img_update(String elem_id, String elem_src, int elem_width, int elem_height) {return true;} public boolean Html_elem_delete(String elem_id) {return true;} public boolean Html_elem_replace_html(String id, String html) {return true;} + public boolean Html_elem_append_above(String id, String html) {return true;} public boolean Html_gallery_packed_exec() {return true;} public String Html_js_eval_script(String script) {return "";} String ExtractAtr(String key, String txt, int pos) { 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 9a0030669..b650839bc 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -92,6 +92,7 @@ public class Swt_kit implements Gfui_kit { gui_wtr.Log_many("", "", "swt.kit.term:bgn"); cursor.dispose(); gui_wtr.Log_many("", "", "swt.kit.term:cursor"); } + public Shell Main_shell() {return shell;} public void Kit_term() { clipboard.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:clipboard"); msg_wkr_stop.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:usrMsgWkr"); @@ -198,6 +199,9 @@ public class Swt_kit implements Gfui_kit { return 8; } } + public boolean Window_is_disposed() { + return shell.isDisposed(); + } public void Set_mnu_popup(GfuiElem owner, Gfui_mnu_grp grp) { Control control = Swt_control_.cast_or_fail(owner).Under_menu_control(); Swt_popup_grp popup = (Swt_popup_grp)grp; diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index 3281cf38a..50215a836 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -84,6 +84,7 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { {return Eval_script_as_exec(kit.Html_cfg().Elem_atr_set_append(elem_id, atr_key, Escape_quotes(atr_val)));} public boolean Html_elem_delete(String elem_id) {return Eval_script_as_exec(kit.Html_cfg().Elem_delete(elem_id));} public boolean Html_elem_replace_html(String id, String html) {return Eval_script_as_exec(kit.Html_cfg().Elem_replace_html(id, html));} + public boolean Html_elem_append_above(String id, String html) {return Eval_script_as_exec(kit.Html_cfg().Elem_append_above(id, html));} public boolean Html_gallery_packed_exec() {return Eval_script_as_exec(kit.Html_cfg().Gallery_packed_exec());} public boolean Html_elem_focus(String elem_id) {return Eval_script_as_exec(kit.Html_cfg().Elem_focus(elem_id));} public boolean Html_elem_scroll_into_view(String id) {return Eval_script_as_bool(kit.Html_cfg().Elem_scroll_into_view(Escape_quotes(id)));} diff --git a/400_xowa/src/gplx/core/btries/Btrie_fast_mgr.java b/400_xowa/src/gplx/core/btries/Btrie_fast_mgr.java index b206aa003..015fb56cf 100644 --- a/400_xowa/src/gplx/core/btries/Btrie_fast_mgr.java +++ b/400_xowa/src/gplx/core/btries/Btrie_fast_mgr.java @@ -44,6 +44,7 @@ public class Btrie_fast_mgr { } public Btrie_fast_mgr Add_bry_bval(byte key, byte val) {return Add(new byte[] {key}, Byte_obj_val.new_(val));} public Btrie_fast_mgr Add_bry_bval(byte[] key, byte val) {return Add(key, Byte_obj_val.new_(val));} + public Btrie_fast_mgr Add_str_byte(String key, byte val) {return Add(Bry_.new_utf8_(key), Byte_obj_val.new_(val));} public Btrie_fast_mgr Add(byte key, Object val) {return Add(new byte[] {key}, val);} public Btrie_fast_mgr Add(String key, Object val) {return Add(Bry_.new_utf8_(key), val);} public Btrie_fast_mgr Add(byte[] key, Object val) { diff --git a/400_xowa/src/gplx/core/regxs/Gfo_pattern.java b/400_xowa/src/gplx/core/regxs/Gfo_pattern.java index d4317b4be..ea3f0c916 100644 --- a/400_xowa/src/gplx/core/regxs/Gfo_pattern.java +++ b/400_xowa/src/gplx/core/regxs/Gfo_pattern.java @@ -17,14 +17,14 @@ along with this program. If not, see . */ package gplx.core.regxs; import gplx.*; import gplx.core.*; public class Gfo_pattern { - private Gfo_pattern_itm[] itms; int itms_len; + private final Gfo_pattern_itm[] itms; private final int itms_len; + private final Gfo_pattern_ctx ctx = new Gfo_pattern_ctx(); public Gfo_pattern(byte[] raw) { this.raw = raw; itms = Gfo_pattern_itm_.Compile(raw); itms_len = itms.length; } public byte[] Raw() {return raw;} private byte[] raw; - private Gfo_pattern_ctx ctx = new Gfo_pattern_ctx(); public boolean Match(byte[] val) { int val_len = val.length; int val_pos = 0; diff --git a/400_xowa/src/gplx/core/regxs/Gfo_pattern_ctx.java b/400_xowa/src/gplx/core/regxs/Gfo_pattern_ctx.java index b7319ff31..994960f1c 100644 --- a/400_xowa/src/gplx/core/regxs/Gfo_pattern_ctx.java +++ b/400_xowa/src/gplx/core/regxs/Gfo_pattern_ctx.java @@ -24,7 +24,8 @@ public class Gfo_pattern_ctx { public int Itm_idx() {return itm_idx;} public void Itm_idx_(int v) {itm_idx = v;} private int itm_idx; public boolean Itm_idx_is_last() {return itm_idx == itm_len - 1;} public void Init(int itm_len) { - rslt = true; + this.rslt = true; this.itm_len = itm_len; + this.prv_was_wild = false; } } diff --git a/400_xowa/src/gplx/core/regxs/Gfo_pattern_itm_.java b/400_xowa/src/gplx/core/regxs/Gfo_pattern_itm_.java index 2e90b2071..866e16e9e 100644 --- a/400_xowa/src/gplx/core/regxs/Gfo_pattern_itm_.java +++ b/400_xowa/src/gplx/core/regxs/Gfo_pattern_itm_.java @@ -29,10 +29,10 @@ public class Gfo_pattern_itm_ { byte b = last ? Byte_ascii.Nil : raw[pos]; switch (b) { case Byte_ascii.Nil: - if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null;} + if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null; itm_bgn = -1;} break; case Byte_ascii.Asterisk: - if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null;} + if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null; itm_bgn = -1;} rv.Add(Gfo_pattern_itm_wild._); break; default: diff --git a/400_xowa/src/gplx/core/regxs/Gfo_pattern_tst.java b/400_xowa/src/gplx/core/regxs/Gfo_pattern_tst.java index bec23051c..29265539e 100644 --- a/400_xowa/src/gplx/core/regxs/Gfo_pattern_tst.java +++ b/400_xowa/src/gplx/core/regxs/Gfo_pattern_tst.java @@ -46,6 +46,16 @@ public class Gfo_pattern_tst { fxt.Test_Match_y(pattern, "abc", "xyzabc"); fxt.Test_Match_n(pattern, "abcd", ""); } + @Test public void Match_mid() { + Gfo_pattern pattern = fxt.pattern_("a*c*e"); + fxt.Test_Match_y(pattern, "ace", "abcde"); + fxt.Test_Match_n(pattern, "abc", ""); + } + @Test public void Bug_ctx() { // PURPOSE.fix: cb was true b/c ctx was not reset correctly + Gfo_pattern pattern = fxt.pattern_("b*"); + fxt.Test_Match_y(pattern, "bc"); + fxt.Test_Match_n(pattern, "cb"); + } } class Gfo_pattern_itm_fxt { public void Clear() {} diff --git a/400_xowa/src/gplx/core/xmls/Gfo_xml_wtr.java b/400_xowa/src/gplx/core/xmls/Gfo_xml_wtr.java new file mode 100644 index 000000000..fb127ed7b --- /dev/null +++ b/400_xowa/src/gplx/core/xmls/Gfo_xml_wtr.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.core.xmls; import gplx.*; import gplx.core.*; +public class Gfo_xml_wtr { + private final Bry_bfr bfr = Bry_bfr.reset_(255); + private byte quote_byte = Byte_ascii.Quote; + private byte[] quote_escape = Bry_quote_2_escape; + private String nde_cur = null; + public void Quote_(boolean apos) { + if (apos) { + this.quote_byte = Byte_ascii.Apos; + this.quote_escape = Bry_quote_1_escape; + } + else { + this.quote_byte = Byte_ascii.Quote; + this.quote_escape = Bry_quote_2_escape; + } + } + public Gfo_xml_wtr Nde_lhs_bgn(String v) { + this.nde_cur = v; + bfr.Add_byte(Byte_ascii.Angle_bgn).Add_str_utf8(nde_cur); + return this; + } + public Gfo_xml_wtr Nde_lhs_end() { + bfr.Add_byte(Byte_ascii.Angle_end); + return this; + } + public Gfo_xml_wtr Nde_lhs(String v) {this.Nde_lhs_bgn(v); this.Nde_lhs_end(); return this;} + public Gfo_xml_wtr Nde_rhs() { + bfr.Add(Bry_nde_rhs_bgn).Add_str_utf8(nde_cur).Add_byte(Byte_ascii.Angle_end); // EX: + this.nde_cur = null; + return this; + } + public Gfo_xml_wtr Atr_bgn(String key) { + bfr.Add_byte_space().Add_str_utf8(key).Add_byte(Byte_ascii.Eq).Add_byte(quote_byte); + return this; + } + public Gfo_xml_wtr Atr_val_str_a7(String v) {bfr.Add_str_ascii(v); return this;} + public Gfo_xml_wtr Atr_val_str_u8(String v) {bfr.Add_str_utf8 (v); return this;} + public Gfo_xml_wtr Atr_val_bry (byte[] v) {bfr.Add(v); return this;} + public Gfo_xml_wtr Atr_val_int (int v) {bfr.Add_int_variable(v); return this;} + public Gfo_xml_wtr Atr_end() { + bfr.Add_byte(quote_byte); + return this; + } + public Gfo_xml_wtr Atr_kv_int(String key, int val) {return Atr_kv_bry(key, Int_.Xto_bry(val));} + public Gfo_xml_wtr Atr_kv_str_a7(String key, String val) {return Atr_kv_bry(key, Bry_.new_ascii_(val));} + public Gfo_xml_wtr Atr_kv_str_u8(String key, String val) {return Atr_kv_bry(key, Bry_.new_utf8_(val));} + public Gfo_xml_wtr Atr_kv_bry(String key, byte[] val) { + bfr.Add_byte_space().Add_str_utf8(key); + bfr.Add_byte(Byte_ascii.Eq); + Atr_val_quote(val); + return this; + } + private void Atr_val_quote(byte[] val_bry) { + bfr.Add_byte(quote_byte); + bfr.Add_bry_escape(quote_byte, quote_escape, val_bry, 0, val_bry.length); + bfr.Add_byte(quote_byte); + } + public void Txt_bry(byte[] txt) { + bfr.Add(txt); + } + + private static final byte[] + Bry_nde_rhs_bgn = Bry_.new_ascii_("") + , Bry_quote_1_escape = Bry_.new_ascii_("'") + , Bry_quote_2_escape = Bry_.new_ascii_(""") + ; +} diff --git a/400_xowa/src/gplx/dbs/Db_attach_rdr.java b/400_xowa/src/gplx/dbs/Db_attach_rdr.java index 6136686ec..69c977237 100644 --- a/400_xowa/src/gplx/dbs/Db_attach_rdr.java +++ b/400_xowa/src/gplx/dbs/Db_attach_rdr.java @@ -26,7 +26,10 @@ public class Db_attach_rdr { this.diff_db = !String_.Eq(conn_info.Url().Raw(), attach_url.Raw()); } public Db_rdr Exec_as_rdr(String sql) { - if (diff_db) conn.Env_db_attach(attach_name, attach_url); + try { + if (diff_db) conn.Env_db_attach(attach_name, attach_url); + } catch (Exception e) {Err_.Noop(e); Gfo_usr_dlg_.I.Warn_many("", "", "db:failed to attach db; name=~{0} url=~{1}", attach_name, attach_url.Raw());} + sql = String_.Replace(sql, "", diff_db ? attach_name + "." : ""); // replace with either "attach_db." or ""; return conn.Exec_sql_as_rdr2(sql); } public void Rls() { diff --git a/400_xowa/src/gplx/html/Html_utl.java b/400_xowa/src/gplx/html/Html_utl.java index b9bf928f1..cff67e5fb 100644 --- a/400_xowa/src/gplx/html/Html_utl.java +++ b/400_xowa/src/gplx/html/Html_utl.java @@ -18,42 +18,50 @@ along with this program. If not, see . package gplx.html; import gplx.*; import gplx.core.primitives.*; import gplx.core.btries.*; public class Html_utl { - public static byte[] Escape_for_atr_val_as_bry(Bry_bfr tmp_bfr, byte quote_byte, String s) { + private static final Url_encoder encoder_id = Url_encoder.new_html_id_(); private static final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public static String Encode_id_as_str(byte[] key) {return String_.new_utf8_(Encode_id_as_bry(key));} + public static byte[] Encode_id_as_bry(byte[] key) { + byte[] escaped = Escape_html_as_bry(tmp_bfr, key, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.Y); + return encoder_id.Encode(escaped); + } + public static byte[] Escape_for_atr_val_as_bry(Bry_bfr bfr, byte quote_byte, String s) { if (s == null) return null; - return Escape_for_atr_val_as_bry(tmp_bfr, quote_byte, Bry_.new_utf8_(s)); + return Escape_for_atr_val_as_bry(bfr, quote_byte, Bry_.new_utf8_(s)); } - public static byte[] Escape_for_atr_val_as_bry(Bry_bfr tmp_bfr, byte quote_byte, byte[] bry) { + public static byte[] Escape_for_atr_val_as_bry(Bry_bfr bfr, byte quote_byte, byte[] bry) { if (bry == null) return null; - boolean dirty = Escape_for_atr_val_as_bry(tmp_bfr, quote_byte, bry, 0, bry.length); - return dirty ? tmp_bfr.Xto_bry_and_clear() : bry; + boolean dirty = Escape_for_atr_val_as_bry(bfr, quote_byte, bry, 0, bry.length); + return dirty ? bfr.Xto_bry_and_clear() : bry; } - public static boolean Escape_for_atr_val_as_bry(Bry_bfr tmp_bfr, byte quote_byte, byte[] src, int bgn, int end) { + public static boolean Escape_for_atr_val_as_bry(Bry_bfr bfr, byte quote_byte, byte[] src, int bgn, int end) { boolean dirty = false; for (int i = bgn; i < end; i++) { byte b = src[i]; if (b == quote_byte) { if (!dirty) { - tmp_bfr.Add_mid(src, bgn, i); + bfr.Add_mid(src, bgn, i); dirty = true; } switch (quote_byte) { - case Byte_ascii.Apos: tmp_bfr.Add(Html_entity_.Apos_num_bry); break; - case Byte_ascii.Quote: tmp_bfr.Add(Html_entity_.Quote_bry); break; + case Byte_ascii.Apos: bfr.Add(Html_entity_.Apos_num_bry); break; + case Byte_ascii.Quote: bfr.Add(Html_entity_.Quote_bry); break; default: throw Err_.unhandled(quote_byte); } } else { if (dirty) - tmp_bfr.Add_byte(b); + bfr.Add_byte(b); } } return dirty; } public static String Escape_html_as_str(String v) {return String_.new_utf8_(Escape_html_as_bry(Bry_.new_utf8_(v)));} public static byte[] Escape_html_as_bry(Bry_bfr tmp, byte[] bry) {return Escape_html(false, tmp, bry, 0, bry.length, true, true, true, true, true);} - public static byte[] Escape_html_as_bry(byte[] bry) {return Escape_html(false, Bry_bfr.new_(), bry, 0, bry.length, true, true, true, true, true);} + public static byte[] Escape_html_as_bry(byte[] bry) {return Escape_html(false, tmp_bfr, bry, 0, bry.length, true, true, true, true, true);} public static byte[] Escape_html_as_bry(byte[] bry, boolean lt, boolean gt, boolean amp, boolean quote, boolean apos) - {return Escape_html(false, Bry_bfr.new_(), bry, 0, bry.length, lt, gt, amp, quote, apos);} + {return Escape_html(false, tmp_bfr, bry, 0, bry.length, lt, gt, amp, quote, apos);} + public static byte[] Escape_html_as_bry(Bry_bfr bfr, byte[] bry, boolean lt, boolean gt, boolean amp, boolean quote, boolean apos) + {return Escape_html(false, bfr, bry, 0, bry.length, lt, gt, amp, quote, apos);} public static void Escape_html_to_bfr(Bry_bfr bfr, byte[] bry, int bgn, int end, boolean escape_lt, boolean escape_gt, boolean escape_amp, boolean escape_quote, boolean escape_apos) { Escape_html(true, bfr, bry, bgn, end, escape_lt, escape_gt, escape_amp, escape_quote, escape_apos); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Js_wtr.java b/400_xowa/src/gplx/web/js/Js_wtr.java similarity index 95% rename from 400_xowa/src/gplx/xowa/specials/search/Js_wtr.java rename to 400_xowa/src/gplx/web/js/Js_wtr.java index 0d8074efe..37bd595ef 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Js_wtr.java +++ b/400_xowa/src/gplx/web/js/Js_wtr.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.*; +package gplx.web.js; import gplx.*; import gplx.web.*; public class Js_wtr { private Bry_bfr bfr = Bry_bfr.reset_(255); 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; diff --git a/400_xowa/src/gplx/xowa/specials/search/Js_wtr_tst.java b/400_xowa/src/gplx/web/js/Js_wtr_tst.java similarity index 92% rename from 400_xowa/src/gplx/xowa/specials/search/Js_wtr_tst.java rename to 400_xowa/src/gplx/web/js/Js_wtr_tst.java index 6d6a919a7..065606da5 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Js_wtr_tst.java +++ b/400_xowa/src/gplx/web/js/Js_wtr_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.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +package gplx.web.js; import gplx.*; import gplx.web.*; import org.junit.*; public class Js_wtr_tst { @Before public void Init() {fxt.Clear();} private Js_wtr_fxt fxt = new Js_wtr_fxt(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index 234457017..8780b2d61 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -28,4 +28,5 @@ public interface Xoa_app { Gfo_usr_dlg Usr_dlg(); Bry_bfr_mkr Utl__bfr_mkr(); Url_encoder_mgr Utl__encoder_mgr(); + boolean Xwiki_mgr__missing(byte[] domain); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index b18df21e1..e3032aa48 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -26,7 +26,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "2.4.1.1"; + public static final String Version = "2.4.2.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; @@ -39,7 +39,8 @@ public class Xoa_app_ { return rv; } - public static byte Mode = Xoa_app_.Mode_console; + public static byte Mode() {return mode;} public static void Mode_(byte v) {mode = v;} private static byte mode = Xoa_app_.Mode_console; + public static boolean Mode_is_gui() {return mode == Xoa_app_.Mode_gui;} 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 Url_encoder_mgr Utl__encoder_mgr() {return utl__encoder_mgr;} private static final Url_encoder_mgr utl__encoder_mgr = new Url_encoder_mgr(); @@ -172,17 +173,19 @@ class Xoa_app_boot_mgr { // launch app.Launch(); chkpoint = "launch"; - if (String_.Eq(app_mode, "server")) + if (String_.Eq(app_mode, "server")) { + Xoa_app_.Mode_(Xoa_app_.Mode_http); app.Tcp_server().Run(); + } else if (String_.Eq(app_mode, "http_server")) { - Xoa_app_.Mode = Xoa_app_.Mode_http; + Xoa_app_.Mode_(Xoa_app_.Mode_http); app.Http_server().Run(); } else { if (cmd_text != null) ConsoleAdp._.WriteLine_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text))); if (app_mode_gui) { - Xoa_app_.Mode = Xoa_app_.Mode_gui; + Xoa_app_.Mode_(Xoa_app_.Mode_gui); app.Gui_mgr().Run(); chkpoint = "run"; } else // teardown app, else lua will keep process running diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 1ffa5e34e..fe2861fea 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -60,7 +60,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { html_mgr = new Xoh_html_mgr(this); // queue_file = new Xop_queue_mgr(this); } - public byte Mode() {return Xoa_app_.Mode;} + public byte Mode() {return Xoa_app_.Mode();} public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr; public Xof_cache_mgr File_mgr__cache_mgr() {return file_mgr.Cache_mgr();} public Xof_img_mgr File_mgr__img_mgr() {return file_mgr.Img_mgr();} @@ -108,8 +108,8 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Gfo_log_bfr Log_bfr() {return log_bfr;} private Gfo_log_bfr log_bfr = new Gfo_log_bfr(); public Xoa_sys_cfg Sys_cfg() {return sys_cfg;} private Xoa_sys_cfg sys_cfg; public Bry_fmtr Tmp_fmtr() {return tmp_fmtr;} Bry_fmtr tmp_fmtr = Bry_fmtr.new_(""); - public boolean Xwiki_missing(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) == null;} // NOTE: only the user_wiki has a full list of all wikis b/c it has xwiki objects; wiki_mgr does not, b/c it has heavier wiki objects which are loaded dynamically; - public boolean Xwiki_exists(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) != null;} + public boolean Xwiki_mgr__missing(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) == null;} // NOTE: only the user_wiki has a full list of all wikis b/c it has xwiki objects; wiki_mgr does not, b/c it has heavier wiki objects which are loaded dynamically; + public boolean Xwiki_mgr__exists(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) != null;} public Xoa_ctg_mgr Ctg_mgr() {return ctg_mgr;} private Xoa_ctg_mgr ctg_mgr = new Xoa_ctg_mgr(); public Xoa_fsys_eval Url_cmd_eval() {return url_cmd_eval;} Xoa_fsys_eval url_cmd_eval; public Xoa_cur Cur_redirect() {return cur_redirect;} private Xoa_cur cur_redirect; @@ -158,6 +158,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { } gui_mgr.Browser_win().Usr_dlg().Canceled_y_(); user.App_term(); usr_dlg.Log_many("", "", "term:app_term"); + gui_mgr.Browser_win().Tab_mgr().Tabs_close_all(); log_wtr.Term(); usr_dlg.Log_many("", "", "term:log_wtr"); log_mgr.Rls(); usr_dlg.Log_many("", "", "term:log_mgr"); if (Scrib_core.Core() != null) {Scrib_core.Core().Term(); usr_dlg.Log_many("", "", "term:scrib");} diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java b/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java index 006509e7f..5c25c1ac8 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java @@ -155,6 +155,8 @@ net { } usr { } +special { +} xtns { } bldr { diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java index 5da4b8482..a5a35a2c2 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java @@ -45,6 +45,7 @@ public class Xoapi_root implements GfoInvkAble { 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(); private void Exec(String key) { Xog_cmd_itm cmd_itm = app.Gui_mgr().Cmd_mgr().Get_or_null(key); @@ -59,12 +60,13 @@ public class Xoapi_root implements GfoInvkAble { else if (ctx.Match(k, Invk_html)) return html_api; else if (ctx.Match(k, Invk_net)) return net_api; else if (ctx.Match(k, Invk_usr)) return usr_api; + else if (ctx.Match(k, Invk_special)) return special_api; else if (ctx.Match(k, Invk_xtns)) return xtns_api; else if (ctx.Match(k, Invk_exec)) Exec(m.ReadStr("v")); return this; } 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_xtns = "xtns" + , 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" ; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_special.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_special.java new file mode 100644 index 000000000..38cb8642b --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_special.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.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; +import gplx.xowa.apis.xowa.specials.*; +public class Xoapi_special implements GfoInvkAble { + public void Ctor_by_app(Xoae_app app) { + } + public void Init_by_kit(Xoae_app app) { + } + public Xoapi_search Search() {return search;} private Xoapi_search search = new Xoapi_search(); + 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/apis/xowa/specials/Xoapi_search.java b/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java new file mode 100644 index 000000000..631126f86 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java @@ -0,0 +1,34 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; +public class Xoapi_search implements GfoInvkAble { + public int Results_per_page() {return results_per_page;} private int results_per_page = 20; + public boolean Async_db() {return async_db;} private boolean async_db = true; + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_results_per_page)) return results_per_page; + else if (ctx.Match(k, Invk_results_per_page_)) results_per_page = m.ReadInt("v"); + else if (ctx.Match(k, Invk_async_db)) return Yn.Xto_str(async_db); + else if (ctx.Match(k, Invk_async_db_)) async_db = m.ReadYn("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String + Invk_results_per_page = "results_per_page" , Invk_results_per_page_ = "results_per_page_" + , Invk_async_db = "async_db" , Invk_async_db_ = "async_db_" + ; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java index 8d2d1475f..46d3a6dd7 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java @@ -19,7 +19,7 @@ package gplx.xowa.apis.xowa.startups.tabs; import gplx.*; import gplx.xowa.*; im public class Xoapi_startup_tabs implements GfoInvkAble { public String Custom() {return custom;} private String custom; public boolean Custom_is_expr() {return custom_is_expr;} private boolean custom_is_expr; - public String Previous() {return previous;} public Xoapi_startup_tabs Previous_(String v) {previous = v; return this;} private String previous; + public String Previous() {return previous;} private String previous; public String Manual() {return manual;} public void Manual_(String v) {manual = v;} private String manual; public byte Type() {return type;} private byte type = Xoapi_startup_tabs_tid_.Tid_previous; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { 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 c8380284d..3d98db93c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -49,6 +49,7 @@ public class Xob_cmd_keys { , Key_wbase_qid = "wbase.qid" // "text.wdata.qid" , Key_wbase_pid = "wbase.pid" // "text.wdata.pid" , Key_wbase_db = "wbase.db" // "wiki.wdata_db" + , Key_wbase_ns = "wbase.ns" , Key_tdb_text_init = "tdb.text.init" // "core.init" , Key_tdb_make_page = "tdb.text.page" // "core.make_page" , Key_tdb_make_id = "core.make_id" 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 601bef69a..caa502367 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -58,6 +58,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { 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_wbase_ns)) return Add(new Xob_site_ns_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)); 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 f5e77a4f7..b16ed54c7 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 @@ -45,8 +45,10 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink return conn; } @Override protected void Cmd_bgn_end() { - ns_file_is_case_match_all = Ns_file_is_case_match_all(wiki); // NOTE: must call after wiki.init - wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Ctgs_enabled_(false); // disable categories else progress messages written (also for PERF) + ns_file_is_case_match_all = Ns_file_is_case_match_all(wiki); // NOTE: must call after wiki.init + wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Ctgs_enabled_(false); // disable categories else progress messages written (also for PERF) + if (wiki.File_mgr__bin_mgr() != null) + wiki.File_mgr__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // remove wmf wkr, else will try to download images during parsing commons_wiki = app.Wiki_mgr().Get_by_key_or_make(Xow_domain_.Domain_bry_commons); Xop_log_mgr log_mgr = ctx.App().Log_mgr(); log_mgr.Log_dir_(wiki.Fsys_mgr().Root_dir()); // put log in wiki dir, instead of user.temp @@ -66,6 +68,9 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink trg_fsdb_mgr.Init_by_wiki(wiki); Fsm_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr(); Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.I.Make(wiki); + wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make + wiki.File_mgr__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing + wiki.File_mgr__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(fsdb_core); trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); Fsm_mnt_mgr.Patch(trg_mnt_mgr.Mnts__get_main().Cfg_mgr().Tbl()); // NOTE: see fsdb_make; DATE:2014-04-26 diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java index bb0f68d95..a3c2fbf66 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java @@ -34,7 +34,7 @@ public class Xob_css_cmd implements Xob_cmd { core_db.Tbl__css_core().Create_tbl(); core_db.Tbl__css_file().Create_tbl(); gplx.xowa.html.css.Xowd_css_core_mgr.Set(core_db.Tbl__css_core(), core_db.Tbl__css_file(), css_dir); - core_db.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__tbl_css_core, Bool_.Y); + core_db.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__tbl_css_core, Bool_.Y); core_db.Conn().Txn_end(); usr_dlg.Plog_many("", "", Cmd_key() + ":end;"); } 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 index efd7dd2e0..4a9fa1d71 100644 --- 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 @@ -78,6 +78,7 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { ? 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_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java index 330992a6c..6fababcc8 100644 --- 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 @@ -20,7 +20,7 @@ import gplx.ios.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.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 = Bry_.Empty; + private int search_id = 0; private byte[] prv_word = Bry_.Empty; 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.ios.Io_make_cmd Make_cmd_site() {return this;} @@ -37,16 +37,20 @@ public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { byte[] bry = rdr.Bfr(); byte[] cur_word = Bry_.Mid(bry, rdr.Key_pos_bgn(), rdr.Key_pos_end()); if (!Bry_.Eq(cur_word, prv_word)) { - search_word_tbl.Insert_cmd_by_batch(++search_id, cur_word); + search_word_tbl.Insert_cmd_by_batch(++search_id, cur_word, page_count); prv_word = cur_word; + page_count = 0; } search_page_tbl.Insert_cmd_by_batch(search_id, Base85_utl.XtoIntByAry(bry, rdr.Key_pos_end() + 1, rdr.Key_pos_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_page_tbl.Insert_end(); search_word_tbl.Insert_end(); - Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(db_mgr.Db__search().Conn(), db_mgr.Props().Schema_is_1()); + 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()); } } 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 ad722cf15..a31aab719 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 @@ -41,7 +41,7 @@ public class Xob_redirect_tbl { Sqlite_engine_.Db_detach(conn, "page_db"); } public void Update_src_redirect_id(Io_url core_url, Db_conn core_provider) { - core_provider.Exec_sql(Sql_ddl__page_redirect_id); // create page.page_redirect_id +// core_provider.Exec_sql(Sql_ddl__page_redirect_id); // create page.page_redirect_id Sqlite_engine_.Idx_create(conn, Idx_trg_src); Sqlite_engine_.Db_attach(conn, "page_db", core_url.Raw()); // link database with page table conn.Exec_sql(Sql_update_redirect_id); // update page_redirect_id @@ -90,9 +90,9 @@ public class Xob_redirect_tbl { , 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 - Sql_ddl__page_redirect_id = "ALTER TABLE page ADD COLUMN page_redirect_id integer NOT NULL DEFAULT '-1'" - ; +// 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 Sql_get_page_data = String_.Concat_lines_nl // get data from page table for initial redirect dump ( "REPLACE INTO redirect " @@ -154,8 +154,8 @@ public class Xob_redirect_tbl { , ", p.page_touched" , ", p.page_len" , ", p.page_random_int" - , ", p.page_file_idx" -// , ", p.page_html_db_id" + , ", p.page_text_db_id" + , ", p.page_html_db_id" , ", r.trg_id" , "FROM redirect r" , " JOIN page_db.page p ON r.src_id = p.page_id" diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java index 676985b93..0fe834fba 100644 --- a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java @@ -56,6 +56,6 @@ public class Xob_info_session { , Cfg_key__time = "time" // EX: 20150102 030405 , Cfg_key__guid = "guid" // EX: 00000000-0000-0000-0000-000000000000 ; - public static Xob_info_session new_(String user, String wiki_domain, String dump_name) {return new Xob_info_session(user, Xoa_app_.Version, wiki_domain, dump_name, DateAdp_.Now(), Guid_adp_.random_());} + public static Xob_info_session new_(String user, String wiki_domain, String dump_name) {return new Xob_info_session(user, Xoa_app_.Version, wiki_domain, dump_name, DateAdp_.Now(), Guid_adp_.Empty);} public static final Xob_info_session Test = new_("anonymous", "en.wikipedia.org", "enwiki-latest-pages-articles"); } diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_export_wkr.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_export_wkr.java new file mode 100644 index 000000000..768608ef5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_export_wkr.java @@ -0,0 +1,150 @@ +/* +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.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.core.xmls.*; import gplx.xowa.wikis.data.tbls.*; +class Xob_export_wtr { + public void Write(Xowd_page_itm page) { + + } + public void Write_search() { + // Xoh_html_bldr bldr = new Xoh_html_bldr(); + // bldr.Write_lnki(null, null, 0, + } +} +class Xoh_html_bldr { + private final Gfo_xml_wtr html_wtr = new Gfo_xml_wtr(); + public void Write_lnki(Xow_ns_mgr ns_mgr, byte[] wiki, int id, byte[] page, int ns_id, byte[] text) { // EX: Page + Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); + if (ns == null) {/*use main_ns; log*/} + byte[] page_ttl_db = null; // TODO: url_encode + byte[] title = null; + html_wtr.Nde_lhs_bgn("a"); + html_wtr.Atr_bgn("href" ).Atr_val_str_a7("/site/").Atr_val_bry(wiki).Atr_val_bry(page_ttl_db).Atr_end(); + html_wtr.Atr_bgn("id" ).Atr_val_str_a7("xowa_lnki_").Atr_val_int(id).Atr_end(); + html_wtr.Atr_kv_bry("title", title); + html_wtr.Nde_lhs_end(); + html_wtr.Txt_bry(text); + html_wtr.Nde_rhs(); + } +// 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 (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(Html_tag_.B_lhs); +// Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); +// bfr.Add(Html_tag_.B_rhs); +// return; +// } +// } +// if (lnki.Xtn_sites_link()) return; // lnki marked for relatedSites; don't write to page +// if (hctx.Mode_is_alt()) +// Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); +// else { +// if (hctx.Mode_is_hdump()) +// wiki.Html_mgr().Hzip_mgr().Itm__anchor().Html_plain(bfr, lnki); +// else +// bfr.Add(Xoh_consts.A_bgn); // ' Roman empire +// Html_utl.Escape_html_to_bfr(bfr, lnki_title_bry, 0, lnki_title_bry.length, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); // escape title; DATE:2014-10-27 +// } +// if (hctx.Mode_is_hdump()) { +// bfr.Add(gplx.xowa.html.hdumps.abrvs.Xohd_abrv_.Html_redlink_bgn); +// bfr.Add_int_variable(lnki.Html_id()); +// bfr.Add(gplx.xowa.html.hdumps.abrvs.Xohd_abrv_.Html_redlink_end); +// } +// else { +// if (cfg.Lnki_visited() +// && history_mgr.Has(wiki.Domain_bry(), ttl_bry)) +// bfr.Add(Bry_xowa_visited); // '" class="xowa-visited' +// bfr.Add(Xoh_consts.__end_quote); // '">' +// } +// if (lnki_ttl.Anch_bgn() != -1 && !lnki_ttl.Ns().Id_main()) { // anchor exists and not main_ns; anchor must be manually added b/c Xoa_ttl does not handle # for non main-ns +// byte[] anch_txt = lnki_ttl.Anch_txt(); +// byte anch_spr +// = (anch_txt.length > 0 && anch_txt[0] == Byte_ascii.Hash) // 1st char is #; occurs when page_txt has trailing space; causes 1st letter of anch_txt to start at # instead of 1st letter +// ? Byte_ascii.Space // ASSUME: 1 space ("Help:A #b"); does not handle multiple spaces like ("Help:A #b"); needs change to Xoa_ttl +// : Byte_ascii.Hash; // Anch_txt bgns at 1st letter, so add # for caption; +// ttl_bry = Bry_.Add_w_dlm(anch_spr, ttl_bry, anch_txt); // manually add anchor; else "Help:A#b" becomes "Help:A". note that lnki.Ttl_ary() uses .Full_txt (wiki + page but no anchor) to captialize 1st letter of page otherwise "Help:A#b" shows as "Help:A" (so Help:a -> Help:A); DATE:2013-06-21 +// } +// Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); +// bfr.Add(Xoh_consts.A_end); // +// } +// } +} +/* + + + Wikipedia + simplewiki + http://simple.wikipedia.org/wiki/Main_Page + MediaWiki 1.25wmf20 + first-letter + + Media + Special + + Talk + User + User talk + Wikipedia + Wikipedia talk + File + File talk + MediaWiki + MediaWiki talk + Template + Template talk + Help + Help talk + Category + Category talk + Module + Module talk + + + + April + 0 + 1 + + 4926273 + 4784983 + 2014-10-30T22:07:53Z + + AJona1992 + 104337 + + Events in April +Selena Day in Texas + wikitext + text/x-wiki + {{monththisyear|4}} +{{Months}} + 5dbo5ljegrwg7jdt0z5myizoeryhwft + + +*/ diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java index 9dcd6f743..09725e5b3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java @@ -28,7 +28,7 @@ public class Xob_import_marker { Io_mgr._.DeleteFil_args(url_(wiki)).MissingFails_off().Exec(); } public boolean Chk(Xowe_wiki wiki) { - if (Xoa_app_.Mode != Xoa_app_.Mode_gui) return true; // NOTE: ignore during Server / Console modes; DATE:2015-04-01 + if (!Xoa_app_.Mode_is_gui()) return true; // NOTE: ignore during Server / Console modes; DATE:2015-04-01 if (in_progress_hash.Has(wiki.Domain_bry())) return true; // NOTE: ignore if currently building; different bldr commands call wiki.Init_assert() which may lead to fals checks; Io_url url = url_(wiki); if (!Io_mgr._.ExistsFil(url)) return true; diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java index ff54a7b4b..5a34c1cc1 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java @@ -24,7 +24,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { public byte Search_version() { if (search_version_init_needed) Search_version_init(); return search_version; - } private byte search_version = gplx.xowa.specials.search.Xosrh_core.Version_null; + } private byte search_version = gplx.xowa.specials.search.Xows_page__search.Version_null; public void Search_version_refresh() { search_version_init_needed = true; Search_version_init(); @@ -121,12 +121,12 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { if (search_version_init_needed) { search_version_init_needed = false; Xowd_db_file search_db = db_mgr.Core_data_mgr().Db__search(); - search_version = search_db == Xowd_db_file.Null ? Xosrh_core.Version_1 : Xosrh_core.Version_2; + search_version = search_db == Xowd_db_file.Null ? Xows_page__search.Version_1 : Xows_page__search.Version_2; } } public void Load_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { if (search_version_init_needed) Search_version_init(); - if (search_version == gplx.xowa.specials.search.Xosrh_core.Version_1) + if (search_version == gplx.xowa.specials.search.Xows_page__search.Version_1) db_mgr.Core_data_mgr().Tbl__page().Select_by_search(cancelable, rv, search, results_max); else { Xowd_db_mgr core_data_mgr = db_mgr.Core_data_mgr(); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java index 941494587..c6b342788 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java @@ -67,14 +67,14 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { public void Load_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { Xow_ns ns = wiki.Ns_mgr().Ns_main(); int search_len = search.length; - byte match_tid = Xosrh_core.Match_tid_all; + byte match_tid = Xows_page__search.Match_tid_all; if (search_len > 0 && search[search_len - 1] == Byte_ascii.Asterisk) { search = Bry_.Mid(search, 0, search_len - 1); - match_tid = Xosrh_core.Match_tid_bgn; + match_tid = Xows_page__search.Match_tid_bgn; } int bgn_idx = this.Find_file_idx_by_ns(Xotdb_dir_info_.Tid_search_ttl, ns, search); if (bgn_idx == Xow_data_mgr.File_idx_unknown) return; - if (match_tid == Xosrh_core.Match_tid_all) { + if (match_tid == Xows_page__search.Match_tid_all) { if (!this.Load_xdat_file(cancelable, tmp_xdat_file, Xotdb_dir_info_.Tid_search_ttl, ns, bgn_idx)) return; tmp_xdat_file.Find(tmp_xdat_itm, search, 0, Byte_ascii.Pipe, true); if (tmp_xdat_itm.Missing()) return; diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java index f025cc776..634972566 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java @@ -41,7 +41,7 @@ public class Xodb_mgr_txt implements Xodb_mgr { } return category_version; } byte category_version = Xoa_ctg_mgr.Version_null; - public byte Search_version() {return gplx.xowa.specials.search.Xosrh_core.Version_2;} + public byte Search_version() {return gplx.xowa.specials.search.Xows_page__search.Version_2;} public void Search_version_refresh() {throw Err_.not_implemented_();} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format); 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 deca956ae..ad8f24b29 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 @@ -68,7 +68,7 @@ class Xof_file_fxt { orig_mgr.Find_by_list(OrderedHash_.new_bry_(), itms_list, Xof_exec_tid.Tid_wiki_page); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Xow_ns_.Id_main, ttl_bry); Xoae_page page = Xoae_page.new_(wiki, ttl); - fsdb_mgr.Fsdb_search_by_list(arg.Exec_tid(), itms_list, page, Xog_js_wkr_.Null); + fsdb_mgr.Fsdb_search_by_list(arg.Exec_tid(), itms_list, page, Xog_js_wkr_.Noop); if (arg.Rslt_orig_exists() != Bool_.__byte) Tfds.Eq(arg.Rslt_orig_exists() == Bool_.Y_byte, itm.Orig_exists(), "orig_exists"); if (arg.Rslt_file_exists() != Bool_.__byte) Tfds.Eq(arg.Rslt_file_exists() == Bool_.Y_byte, itm.File_exists(), "file_exists"); if (arg.Rslt_file_resized() != Bool_.__byte) Tfds.Eq(arg.Rslt_file_resized() == Bool_.Y_byte, itm.File_resized(), "file_resize"); diff --git a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java index 23f07ca8e..0577f7f86 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java @@ -20,7 +20,7 @@ import gplx.xowa.xtns.gallery.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.gui.views.*; public class Js_img_mgr { public static void Update_img(Xoae_page page, Xof_xfer_itm itm) { - Xog_js_wkr js_wkr = Env_.Mode_testing() ? Xog_js_wkr_.Null : page.Tab().Html_itm(); + Xog_js_wkr js_wkr = Env_.Mode_testing() ? Xog_js_wkr_.Noop : page.Tab_data().Tab().Html_itm(); Js_img_mgr.Update_img(page, js_wkr, itm.Html_img_wkr(), itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), String_.new_utf8_(itm.Html_view_url()), itm.Orig_w(), itm.Orig_h(), String_.new_utf8_(itm.Html_orig_url()), itm.Lnki_ttl(), itm.Gallery_mgr_h()); } public static void Update_img(Xoa_page page, Xog_js_wkr js_wkr, Xof_fsdb_itm itm) { @@ -30,7 +30,7 @@ public class Js_img_mgr { html_itm.Html_elem_atr_set_append(html_id, "class", " new"); } private static void Update_img(Xoa_page page, Xog_js_wkr js_wkr, Js_img_wkr img_wkr, int uid, byte lnki_type, byte elem_tid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, byte[] lnki_ttl, int gallery_mgr_h) { - if (Xoa_app_.Mode != Xoa_app_.Mode_gui) return; // do not update html widget unless app is gui; null ref on http server; DATE:2014-09-17 + if (!Xoa_app_.Mode_is_gui()) return; // do not update html widget unless app is gui; null ref on http server; DATE:2014-09-17 switch (elem_tid) { case Xof_html_elem.Tid_gallery_v2: img_wkr.Html_update(page, js_wkr, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src, lnki_ttl); diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java index bc9ef6881..12c9e0f8e 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java @@ -22,4 +22,5 @@ public interface Xog_js_wkr { void Html_atr_set (String uid, String key, String val); void Html_elem_replace_html (String uid, String html); + void Html_elem_append_above (String uid, String html); } diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java index 8cc9a467c..6c16c679c 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java @@ -17,11 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.files.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public class Xog_js_wkr_ { - public static final Xog_js_wkr Null = new Xog_js_wkr__null(); + public static final Xog_js_wkr Noop = new Xog_js_wkr__noop(); } -class Xog_js_wkr__null implements Xog_js_wkr { +class Xog_js_wkr__noop implements Xog_js_wkr { public void Html_img_update (String uid, String src, int w, int h) {} public void Html_atr_set (String uid, String key, String val) {} public void Html_elem_replace_html (String uid, String html) {} + public void Html_elem_append_above (String uid, String html) {} public void Html_redlink (String html_uid) {} } diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java new file mode 100644 index 000000000..c8744333e --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.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.files.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +public class Xog_js_wkr__log implements Xog_js_wkr { + private final ListAdp log_list = ListAdp_.new_(); + public void Html_img_update (String uid, String src, int w, int h) {log_list.Add(Object_.Ary(Proc_img_update, uid, src, w, h));} + public void Html_atr_set (String uid, String key, String val) {log_list.Add(Object_.Ary(Proc_atr_set, uid, key, val));} + public void Html_redlink (String uid) {log_list.Add(Object_.Ary(Proc_redlink, uid));} + public void Html_elem_replace_html (String uid, String html) {log_list.Add(Object_.Ary(Proc_replace_html, uid, html));} + public void Html_elem_append_above (String uid, String html) {log_list.Add(Object_.Ary(Proc_append_above, uid, html));} + + public void Log__clear() {log_list.Clear();} + public int Log__len() {return log_list.Count();} + public Object[] Log__get_at(int i) {return (Object[])log_list.FetchAt(i);} + + public static final String Proc_img_update = "img_update", Proc_atr_set = "atr_set", Proc_redlink = "redlink", Proc_replace_html = "replace_html", Proc_append_above = "append_above"; +} diff --git a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java index e776e9516..0021f3d66 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java @@ -35,7 +35,7 @@ public class Xog_menu_mgr implements GfoInvkAble { } public void Init_by_kit() { try { - if (Xoa_app_.Mode == Xoa_app_.Mode_http) return; // NOTE: do not try to initialize menu if http_server; will fail in headless mode when it tries to load SWT images; DATE:2015-03-27 + if (!Xoa_app_.Mode_is_gui()) return; // NOTE: do not try to initialize menu if http_server; will fail in headless mode when it tries to load SWT images; DATE:2015-03-27 popup_mnu_mgr.Init_by_kit(); window_mnu_mgr.Init_by_kit(); Lang_changed(app.User().Lang()); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java index 1d8f12074..e1122c4f9 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java @@ -63,7 +63,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { html_box.Html_doc_body_focus(); // NOTE: only focus if read so up / down will scroll box; edit / html should focus edit-box; DATE:2014-06-05 page.Root().Data_htm_(html_src); } - } + } private void Html_src_(Xoae_page page, byte[] html_bry) { String html_str = String_.new_utf8_(html_bry); if (owner_tab.Tab_mgr().Html_load_tid__url()) { @@ -112,6 +112,10 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_replace_html).Add("id", id).Add("html", html); GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_replace_html, m); } + public void Html_elem_append_above(String id, String html) { + GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_append_above).Add("id", id).Add("html", html); + GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_append_above, m); + } public void Html_gallery_packed_exec() { if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active; GfoMsg m = GfoMsg_.new_cast_(Invk_html_gallery_packed_exec); @@ -174,6 +178,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { else if (ctx.Match(k, Invk_html_elem_atr_set_append)) html_box.Html_elem_atr_set_append(m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val")); else if (ctx.Match(k, Invk_html_elem_delete)) html_box.Html_elem_delete(m.ReadStr("elem_id")); else if (ctx.Match(k, Invk_html_elem_replace_html)) html_box.Html_elem_replace_html(m.ReadStr("id"), m.ReadStr("html")); + else if (ctx.Match(k, Invk_html_elem_append_above)) html_box.Html_elem_append_above(m.ReadStr("id"), m.ReadStr("html")); else if (ctx.Match(k, Invk_html_gallery_packed_exec)) html_box.Html_gallery_packed_exec(); else if (ctx.Match(k, Invk_html_popups_bind_hover_to_doc)) html_box.Html_js_eval_script("xowa_popups_bind_doc();"); else if (ctx.Match(k, Invk_scroll_page_by_bmk)) Scroll_page_by_bmk(); @@ -186,7 +191,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { private static final String Invk_html_gallery_packed_exec = "html_gallery_packed_exec", Invk_html_popups_bind_hover_to_doc = "html_popups_bind_hover_to_doc" , Invk_html_img_update = "html_img_update", Invk_html_elem_atr_set = "html_elem_atr_set" - , Invk_html_elem_atr_set_append = "html_elem_atr_set_append", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html" + , Invk_html_elem_atr_set_append = "html_elem_atr_set_append", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html", Invk_html_elem_append_above = "html_elem_append_above" , Invk_scroll_page_by_bmk = "scroll_page_by_bmk", Invk_scroll_page_by_id = "scroll_page_by_id" ; public static final String diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java new file mode 100644 index 000000000..6081eb77d --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java @@ -0,0 +1,21 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +public interface Xog_tab_close_lnr { + boolean When_close(Xog_tab_itm tab); +} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java new file mode 100644 index 000000000..b98fc2649 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java @@ -0,0 +1,33 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +public class Xog_tab_close_mgr { + private ListAdp list = ListAdp_.new_(); + public void Clear() {list.Clear();} + public void Add(Xog_tab_close_lnr lnr) {list.Add(lnr);} + public int Len() {return list.Count();} + public Xog_tab_close_lnr Get_at(int i) {return (Xog_tab_close_lnr)list.FetchAt(i);} + public boolean When_close(Xog_tab_itm tab) { + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Xog_tab_close_lnr lnr = Get_at(i); + if (!lnr.When_close(tab)) return false; + } + return true; + } +} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index f029db7a5..880d0b81f 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -55,7 +55,7 @@ public class Xog_tab_itm implements GfoInvkAble { Xoae_page temp_page = page; // switch .page, since its underlying html_box has changed and .page must reflect html_box this.page = comp.page; comp.page = temp_page; - page.Tab_(this); comp.Page().Tab_(comp); + page.Tab_data().Tab_(this); comp.Page().Tab_data().Tab_(comp); byte temp_view_mode = view_mode; // switch .view_mode to match .page this.view_mode = comp.view_mode; @@ -73,7 +73,7 @@ public class Xog_tab_itm implements GfoInvkAble { public boolean Tab_is_loading() {return tab_is_loading;} private boolean tab_is_loading; public Xog_html_itm Html_itm() {return html_itm;} private Xog_html_itm html_itm; public Gfui_html Html_box() {return html_itm.Html_box();} - public Xoae_page Page() {return page;} + public Xoae_page Page() {return page;} public void Page_(Xoae_page page) { this.page = page; this.wiki = page.Wikie(); // NOTE: must update wiki else back doesn't work; DATE:2015-03-05 @@ -100,18 +100,18 @@ public class Xog_tab_itm implements GfoInvkAble { public void Show_url_bgn(Xoa_url url) { this.tab_is_loading = true; Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg(); - Xoae_page page = Xoae_page.Empty; - if ( url.Anchor_str() != null // url has anchor - && url.Eq_page(page.Url()) // url has same page_name as existing page - && url.Args().length == 0) { // url has no args; needed for Category:A?from=b#mw-pages +// Xoae_page page = Xoae_page.Empty; + if ( url.Anchor_str() != null // url has anchor + && url.Eq_page(page.Url()) // url has same page_name as existing page + && url.Args().length == 0) { // url has no args; needed for Category:A?from=b#mw-pages html_itm.Scroll_page_by_id_gui(url.Anchor_str()); // skip page_load and jump to anchor return; } - if (url.Xowa_vnt() != null) { + if (url.Xowa_vnt() != null) wiki.Lang().Vnt_mgr().Cur_vnt_(url.Xowa_vnt()); - } if (win.Page__async__working(url)) return; - app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls + app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls + if (page != null) page.Tab_data().Close_mgr().When_close(this); // cancel any current search cmds app.Log_wtr().Queue_enabled_(true); usr_dlg.Clear(); this.wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); // NOTE: must update wiki @@ -128,6 +128,7 @@ public class Xog_tab_itm implements GfoInvkAble { Xoa_url url = page.Url(); Xoa_ttl ttl = page.Ttl(); Xoae_app app = wiki.Appe(); Gfo_usr_dlg usr_dlg = app.Usr_dlg(); try { + if (page.Tab_data().Cancel_show()) return; // Special:Search canceled show; NOTE: must be inside try b/c finally handles thread wiki.Ctx().Cur_page_(page); if (page.Missing()) { if (wiki.Db_mgr().Save_mgr().Create_enabled()) { @@ -241,7 +242,7 @@ public class Xog_tab_itm implements GfoInvkAble { catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cmds: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));} } try { - if (page.Tab() != null) { // needed b/c Preview has page.Tab of null which causes null_ref error in redlinks + if (page.Tab_data().Tab() != null) { // needed b/c Preview has page.Tab of null which causes null_ref error in redlinks Xog_redlink_mgr redlinks_wkr = new Xog_redlink_mgr(win_itm, page, app.User().Cfg_mgr().Log_mgr().Log_redlinks()); ThreadAdp_.invk_(redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xog_redlink_mgr.Invk_run).Start(); usr_dlg.Prog_none("", "imgs.done", ""); @@ -282,8 +283,10 @@ class Load_page_wkr implements Gfo_thread_wkr { int html_db_id = page.Revision_data().Html_db_id(); if (wiki.Html_mgr__hdump_enabled()) hdump_enabled = true; - if (wiki.Html_mgr__hdump_enabled() && html_db_id != -1) - wiki.Html_mgr__hdump_rdr().Get_by_ttl(page); + if (wiki.Html_mgr__hdump_enabled() && html_db_id != -1) { + wiki.ParsePage(page, false); +// wiki.Html_mgr__hdump_rdr().Get_by_ttl(page); + } else wiki.ParsePage(page, false); GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java index 4dbe1791b..d44399ac1 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java @@ -49,10 +49,10 @@ public class Xog_tab_itm_edit_mgr { byte[] new_text = Get_new_text(tab); Xoae_page new_page = Xoae_page.new_(wiki, page.Ttl()); - new_page.Revision_data().Id_(page.Revision_data().Id()); // NOTE: page_id needed for sqlite (was not needed for xdat) + new_page.Revision_data().Id_(page.Revision_data().Id()); // NOTE: page_id needed for sqlite (was not needed for xdat) new_page.Data_raw_(new_text); wiki.ParsePage_root(new_page, true); // refresh html - tab.Page_(new_page); new_page.Tab_(tab); // replace old page with new_page; DATE:2014-10-09 + tab.Page_(new_page); new_page.Tab_data().Tab_(tab); // replace old page with new_page; DATE:2014-10-09 Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001(); Xoh_page_wtr_wkr wkr = wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java index 553dd0754..48f93802d 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java @@ -122,17 +122,22 @@ public class Xog_tab_mgr implements GfoEvObj { } public void Tabs_close_cur() { if (this.Active_tab_is_null()) return; + if (!active_tab.Page().Tab_data().Close_mgr().When_close(active_tab)) return; tab_mgr.Tabs_close_by_idx(active_tab.Tab_idx()); - Xog_tab_itm cur_tab = this.Active_tab(); + Xog_tab_itm cur_tab = this.Active_tab(); // get new current tab for line below if (cur_tab != null) cur_tab.Html_box().Focus(); // NOTE: needed to focus tab box else tab button will be focused; DATE:2014-07-13 } public void Tabs_close_others() {this.Tabs_close_to_bgn(); this.Tabs_close_to_end();} public void Tabs_close_to_bgn() {if (Active_tab_is_null()) return; Tabs_close_rng(0 , active_tab.Tab_idx());} public void Tabs_close_to_end() {if (Active_tab_is_null()) return; Tabs_close_rng(active_tab.Tab_idx() + 1 , tab_regy.Count());} public void Tabs_close_rng(int bgn, int end) { - for (int i = bgn; i < end; i++) - tab_mgr.Tabs_close_by_idx(bgn); + for (int i = bgn; i < end; i++) { + Xog_tab_itm tab = Tabs_get_at(bgn); + if (tab.Page().Tab_data().Close_mgr().When_close(tab)) + tab_mgr.Tabs_close_by_idx(bgn); + } } + public void Tabs_close_all() {Tabs_close_rng(0, Tabs_len());} public void Tabs_close_undo() { if (closed_undo_list.Count() == 0) return; String url = (String)ListAdp_.Pop(closed_undo_list); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index fcd0657ab..8b3316461 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -41,7 +41,9 @@ public class Xohd_hdump_wtr { core_data_mgr.Tbl__page().Update__html_db_id(page.Revision_data().Id(), html_db_id); } else { - return; + hdump_db = core_data_mgr.Dbs__get_at(html_db_id); + html_db_id = hdump_db.Id(); + // return; } save_mgr.Update(tmp_bfr, hdump_db.Tbl__html(), page); tmp_bfr.Mkr_rls(); @@ -49,6 +51,7 @@ public class Xohd_hdump_wtr { public void Generate_hdump(Bry_bfr tmp_bfr, Xoae_page page) { page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last page_wtr_mgr.Wkr(Xopg_view_mode.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); - page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); + // page.Wikie().Html_mgr().Hzip_mgr().Write(tmp_bfr, new Xodump_stats_itm(), page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); // hzip data + page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java index fda9a1040..877764e8a 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java @@ -77,7 +77,7 @@ class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { 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_redirect_id, page_html_db_id)" + ( "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)" , "SELECT p.page_id" , ", p.page_namespace" , ", p.page_title" @@ -86,8 +86,8 @@ class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { , ", p.page_len" , ", p.page_random_int" , ", p.page_text_db_id" - , ", p.page_redirect_id" , ", {0}" + , ", p.page_redirect_id" , "FROM page p" , " JOIN html h ON p.page_id = h.page_id" ); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java index b6063ad63..b3b280f7f 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java @@ -45,7 +45,7 @@ public class Xob_link_dump_cmd { , ";" )) .Exec(); - conn.Exec_sql("UPDATE rl_dump SET trg_ns = -1 AND trg_ttl = '' WHERE trg_page_id != -1;"); + 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(); } catch (Exception e) { diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java index 3d3eb6ffe..0f2f74cf0 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java @@ -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.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.html.*; import gplx.xowa.wikis.ttls.*; +import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*; +import gplx.html.*; import gplx.xowa.wikis.ttls.*; public class Xow_hzip_itm__anchor { private Xow_hzip_mgr hzip_mgr; private Xow_ttl_parser ttl_parser; private Byte_obj_ref xtid_ref = Byte_obj_ref.zero_(); private Bry_rdr bry_rdr = new Bry_rdr(); @@ -56,8 +57,20 @@ public class Xow_hzip_itm__anchor { return bry_rdr.Pos() + 2; // +2=/> } public int Save_lnki(Bry_bfr bfr, Xodump_stats_itm stats, byte[] src, int src_len, int bgn, int pos, boolean caption) { - int ttl_bgn = Bry_finder.Find_fwd(src, Find_href_wiki_bry, pos, src_len); if (ttl_bgn == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;//hzip_mgr.Warn_by_pos_add_dflt("a.ttl_bgn_missing", bgn, pos); - ttl_bgn += Find_href_wiki_len; + int ttl_bgn = Bry_finder.Find_fwd(src, Find_href_bry, pos, src_len); if (ttl_bgn == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;//hzip_mgr.Warn_by_pos_add_dflt("a.ttl_bgn_missing", bgn, pos); + ttl_bgn += Find_href_bry.length; + // get site + byte[] site = null; + Object href_tid_obj = btrie_href.Match_bgn(src, ttl_bgn, src_len); + if (href_tid_obj == null) return Xow_hzip_mgr.Unhandled; // not "/wiki/" or "/site/" + if (((Byte_obj_val)href_tid_obj).Val() == Href_tid_site) { + // /site/en.wiktionary.org/ + int site_bgn = ttl_bgn + Href_bry_len; int site_end = Bry_finder.Find_fwd(src, Byte_ascii.Slash, site_bgn); + byte[] site_domain = Bry_.Mid(src, site_bgn, site_end); + site = site_domain; + } + else + ttl_bgn += Href_bry_len; int ttl_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, ttl_bgn , src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn); Xoa_ttl ttl = ttl_parser.Ttl_parse(Bry_.Mid(src, ttl_bgn, ttl_end)); if (ttl == null) return hzip_mgr.Warn_by_pos("a.ttl_invalid", ttl_bgn, ttl_end); int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, ttl_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, ttl_end); @@ -67,7 +80,10 @@ public class Xow_hzip_itm__anchor { bfr.Add(Xow_hzip_dict.Bry_lnki_text_y); else bfr.Add(Xow_hzip_dict.Bry_lnki_text_n); - bfr.Add_byte((byte)ttl.Ns().Ord()); // ASSUME:NS_MAX_255 + bfr.Add_byte((byte)ttl.Ns().Ord()); // ASSUME:NS_MAX_255; no more than 255 ns in wiki; note that ids > 255 still supported + if (site != null) { + bfr.Add_byte_pipe().Add(site).Add_byte_pipe(); + } int ttl_len = ttl_end - ttl_bgn; if (caption) { bfr.Add(ttl.Page_db()); @@ -141,12 +157,25 @@ public class Xow_hzip_itm__anchor { public int Load_lnki(Bry_bfr bfr, byte[] src, int src_len, int bgn, byte tid) { byte ns_ord = src[bgn]; Xow_ns ns = ttl_parser.Ns_mgr().Ords_get_at(ns_ord); + byte[] site_bry = null; int ttl_bgn = bgn + 1; + if (src[ttl_bgn] == Byte_ascii.Pipe) { // site + int site_bgn = ttl_bgn + 1; + int site_end = Bry_finder.Find_fwd(src, Byte_ascii.Pipe, site_bgn, src_len); + site_bry = Bry_.Mid(src, site_bgn, site_end); + ttl_bgn = site_end + 1; + } int ttl_end = Bry_finder.Find_fwd(src, Xow_hzip_dict.Escape, ttl_bgn, src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn); byte[] ttl_bry = Bry_.Mid(src, ttl_bgn, ttl_end); Xoa_ttl ttl = ttl_parser.Ttl_parse(ns.Id(), ttl_bry); byte[] ttl_full = ttl.Full_db(); - bfr.Add_str("A"); fxt.Test_load(brys, "A"); } @@ -39,6 +39,11 @@ public class Xow_hzip_itm__anchor_tst { fxt.Test_save(brys, "Template:A'b"); fxt.Test_load(brys, "Template:A'b"); } + @Test public void Srl_lnki_text_n_xwiki() { + byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Byte_ascii.Pipe_bry, Bry_.new_ascii_("en.wiktionary.org"), Byte_ascii.Pipe_bry, Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); + fxt.Test_save(brys, "A"); + fxt.Test_load(brys, "A"); + } @Test public void Srl_lnki_text_n_smoke() { byte[][] brys = Bry_.Ary(Bry_.new_ascii_("a_1"), Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry, Bry_.new_ascii_("a_2")); fxt.Test_save(brys, "a_1Aa_2"); @@ -86,6 +91,10 @@ public class Xow_hzip_itm__anchor_tst { @Test public void Html_lnki_trail() { fxt.Test_html("[[A]]b", "Ab"); } + @Test public void Html_lnki_xwiki() { + fxt.Init_xwiki("wikt", "en.wiktionary.org"); + fxt.Test_html("[[wikt:A]]", "wikt:A"); + } @Test public void Html_lnke_txt() { fxt.Test_html("http://a.org", "http://a.org"); } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr_fxt.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr_fxt.java index 4003751ee..1a505dbcd 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr_fxt.java @@ -26,6 +26,11 @@ class Xow_hzip_mgr_fxt { hzip_mgr = new Xow_hzip_mgr(Gfo_usr_dlg_.I, wiki); } } + public void Init_xwiki(String alias, String domain) { + wiki.Appe().Wiki_mgr().Get_by_key_or_make(Bry_.new_utf8_(domain)); + wiki.Xwiki_mgr().Add_full(alias, domain); + wiki.Appe().User().Wiki().Xwiki_mgr().Add_full(domain, domain); + } public void Test_save(byte[][] expd_brys, String html) {Test_save(html, expd_brys);} public void Test_save(String html, byte[]... expd_brys) { byte[] expd = Bry_.Add(expd_brys); diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java index 89a1a48ba..6b7b2faca 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java @@ -190,7 +190,7 @@ public class Xoh_file_wtr__basic { return scratch_bfr.Xto_bry_and_clear(); } private byte[] msg_file_enlarge; private Bry_fmtr_arg Arg_caption(Xop_ctx ctx, byte[] src, Xoh_wtr_ctx hctx_for_caption, Xop_lnki_tkn lnki) { - return lnki.Caption_exists() ? caption_fmtr.Set(ctx, hctx_for_caption, src, lnki.Caption_val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr) : Bry_fmtr_arg_.Null; + return lnki.Caption_exists() ? caption_fmtr.Set(ctx, hctx_for_caption, src, lnki.Caption_val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr) : Bry_fmtr_arg_.Noop; } public byte[] Arg_alt_text(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki) { if (!lnki.Alt_exists()) return Bry_.Empty; diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java index 5c082fafd..cb97407b9 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; import gplx.core.primitives.*; import gplx.threads.*; +import gplx.web.js.*; import gplx.xowa.gui.views.*; import gplx.xowa.specials.search.*; import gplx.xowa.apis.xowa.html.modules.*; @@ -62,7 +63,7 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { } public String Show_init(int id, byte[] href, byte[] tooltip) { Xoae_page cur_page = Cur_page(); - Xog_tab_itm tab = cur_page.Tab(); + Xog_tab_itm tab = cur_page.Tab_data().Tab(); if (tab != null && tab.Tab_is_loading()) return ""; // NOTE: tab is null when previewing Xow_popup_itm itm = new Xow_popup_itm(id, href, tooltip, show_init_word_count); String rv = String_.new_utf8_(Get_popup_html(Cur_wiki(), cur_page, itm)); @@ -107,10 +108,16 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { Xowe_wiki popup_wiki = app.Wiki_mgr().Get_by_key_or_null(temp_href.Wiki()); popup_wiki.Init_assert(); Xoa_ttl popup_ttl = Xoa_ttl.parse_(popup_wiki, temp_href.Page_and_anchor()); + switch (popup_ttl.Ns().Id()) { + case Xow_ns_.Id_media: + case Xow_ns_.Id_special: + case Xow_ns_.Id_file: + return Bry_.Empty; + } if (ns_allowed_regy.Count() > 0 && !ns_allowed_regy.Has(ns_allowed_regy_key.Val_(popup_ttl.Ns().Id()))) return Bry_.Empty; itm.Init(popup_wiki.Domain_bry(), popup_ttl); Xoae_page popup_page = popup_wiki.Data_mgr().Get_page(popup_ttl, false); - byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab(), itm); + byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab_data().Tab(), itm); Update_progress_bar(app, cur_wiki, cur_page, itm); return rv; } @@ -250,7 +257,7 @@ class Load_popup_wkr implements Gfo_thread_wkr { if (ns_allowed_regy.Count() > 0 && !ns_allowed_regy.Has(ns_allowed_regy_key.Val_(popup_ttl.Ns().Id()))) {Rslt_(Bry_.Empty); return;} itm.Init(popup_wiki.Domain_bry(), popup_ttl); Xoae_page popup_page = popup_wiki.Data_mgr().Get_page(popup_ttl, false); - byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab(), itm); + byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab_data().Tab(), itm); Xow_popup_mgr.Update_progress_bar(app, popup_wiki, cur_page, itm); Rslt_(rv); } diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/keeplists/Xop_keeplist_rule.java b/400_xowa/src/gplx/xowa/html/modules/popups/keeplists/Xop_keeplist_rule.java index 069f38817..00f613ceb 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/keeplists/Xop_keeplist_rule.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/keeplists/Xop_keeplist_rule.java @@ -18,12 +18,12 @@ along with this program. If not, see . package gplx.xowa.html.modules.popups.keeplists; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; import gplx.xowa.html.modules.popups.*; import gplx.core.regxs.*; public class Xop_keeplist_rule { + private Gfo_pattern[] excludes; private int excludes_len; public Xop_keeplist_rule(Gfo_pattern[] includes, Gfo_pattern[] excludes) { this.includes = includes; this.includes_len = includes.length; this.excludes = excludes; this.excludes_len = excludes.length; } public Gfo_pattern[] Includes() {return includes;} private Gfo_pattern[] includes; private int includes_len; - private Gfo_pattern[] excludes; private int excludes_len; public boolean Match(byte[] ttl) { boolean match_found = false; for (int i = 0; i < includes_len; ++i) { diff --git a/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java new file mode 100644 index 000000000..03c35497f --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.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.html.wtrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public class Xoh_lnki_wtr_utl { + private final Xow_wiki wiki; private final Xoh_href_parser href_parser; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + public Xoh_lnki_wtr_utl(Xow_wiki wiki, Xoh_href_parser href_parser) { + this.wiki = wiki; this.href_parser = href_parser; + } + public byte[] Bld_href(byte[] page) { + return href_parser.Build_to_bry(wiki, wiki.Ttl_parse(page)); + } + public byte[] Bld_title(byte[] text) { + return gplx.html.Html_utl.Escape_html_as_bry(tmp_bfr, text, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.Y); + } +} diff --git a/400_xowa/src/gplx/xowa/pages/Xopg_tab_data.java b/400_xowa/src/gplx/xowa/pages/Xopg_tab_data.java new file mode 100644 index 000000000..03acdac3a --- /dev/null +++ b/400_xowa/src/gplx/xowa/pages/Xopg_tab_data.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.pages; import gplx.*; import gplx.xowa.*; +import gplx.xowa.gui.views.*; +public class Xopg_tab_data { + public Xog_tab_itm Tab() {return tab;} public void Tab_(Xog_tab_itm v) {this.tab = v;} private Xog_tab_itm tab; + public boolean Cancel_show() {return cancel_show;} public void Cancel_show_y_() {this.cancel_show = true;} private boolean cancel_show; // used for Special:Search + public Xog_tab_close_mgr Close_mgr() {return close_mgr;} private final Xog_tab_close_mgr close_mgr = new Xog_tab_close_mgr(); + public void Clear() { + this.cancel_show = false; + this.tab = null; + close_mgr.Clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java index 4e1c405a1..e10bd63fa 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java @@ -23,7 +23,7 @@ public class Xog_redlink_mgr implements GfoInvkAble { private Xopg_redlink_lnki_list redlink_lnki_list; private ListAdp lnki_list; private boolean log_enabled; private Gfo_usr_dlg usr_dlg; private int thread_id; public Xog_redlink_mgr(Xog_win_itm win, Xoae_page page, boolean log_enabled) { this.win = win; this.page = page; this.wiki = page.Wikie(); - this.html_itm = page.Tab().Html_itm(); // NOTE: caching locally b/c page.Tab() is sometimes null + this.html_itm = page.Tab_data().Tab().Html_itm(); // NOTE: caching locally b/c page.Tab() is sometimes null this.redlink_lnki_list = page.Redlink_lnki_list(); this.lnki_list = redlink_lnki_list.Lnki_list(); this.thread_id = redlink_lnki_list.Thread_id(); diff --git a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java index 83e7466e3..f5be0beb2 100644 --- a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java +++ b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java @@ -45,6 +45,7 @@ public class Gxw_html_server implements Gxw_html { public boolean Html_elem_atr_set_append(String id, String atr_key, String val) {return Exec_as_bool(cfg.Elem_atr_set_append(id, atr_key, val));} public boolean Html_elem_delete(String id) {return Exec_as_bool(cfg.Elem_delete(id));} public boolean Html_elem_replace_html(String id, String html) {return Exec_as_bool(cfg.Elem_replace_html(id, html));} + public boolean Html_elem_append_above(String id, String html) {return Exec_as_bool(cfg.Elem_append_above(id, html));} public boolean Html_gallery_packed_exec() {return Exec_as_bool(cfg.Gallery_packed_exec());} public boolean Html_elem_focus(String id) {return Exec_as_bool(cfg.Elem_focus(id));} public boolean Html_elem_scroll_into_view(String id) {return Exec_as_bool(cfg.Elem_scroll_into_view(id));} diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java index 5b31c2ac5..bb823f623 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java @@ -87,7 +87,7 @@ public class Http_server_mgr implements GfoInvkAble { byte[] output_html = wiki.Html_mgr().Page_wtr_mgr().Gen(page, Xopg_view_mode.Tid_read); // write html from page data switch (retrieve_mode) { case File_retrieve_mode.Mode_skip: break; // noop - case File_retrieve_mode.Mode_async_server: app.Gui_mgr().Browser_win().Page__async__bgn(page.Tab()); break; + case File_retrieve_mode.Mode_async_server: app.Gui_mgr().Browser_win().Page__async__bgn(page.Tab_data().Tab()); break; case File_retrieve_mode.Mode_wait: if (page.File_queue().Count() > 0) { app.Gui_mgr().Browser_win().Active_tab().Async(); diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 3adea47b1..59918b490 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -27,12 +27,12 @@ public class Xows_mgr { public Xows_mgr(Xowe_wiki wiki, Xol_lang lang) { hash = Hash_adp_bry.ci_utf8_(lang.Case_mgr()); page_allpages = new Xows_page_allpages(wiki); - page_search = new Xosrh_core(wiki); + page_search = new Xows_page__search(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 Xosrh_core Page_search() {return page_search;} private final Xosrh_core page_search; + public Xows_page__search Page_search() {return page_search;} private final Xows_page__search 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(); @@ -66,7 +66,7 @@ public class Xows_mgr { hash.Add_bry_obj(Popup_history_page.Ttl_name_bry , page_popup_history); hash.Add_bry_obj(Xosp_fbrow_special.Ttl_name_bry , page_file_browser); } - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { int slash_pos = Bry_finder.Find_fwd(ttl.Page_txt_wo_qargs(), Xoa_ttl.Subpage_spr); // check for slash byte[] special_name = slash_pos == Bry_.NotFound ? ttl.Base_txt_wo_qarg() // no slash found; use base_txt; ignore qry args and just get page_names; EX: Search/Earth?fulltext=y; Allpages?from=Earth... @@ -80,7 +80,8 @@ public class Xows_mgr { } if (o != null) { Xows_page special = (Xows_page)o; - special.Special_gen(calling_url, page, wiki, ttl); + page.Revision_data().Modified_on_(DateAdp_.Now()); + special.Special_gen(wiki, page, url, ttl); } } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/specials/Xows_page.java b/400_xowa/src/gplx/xowa/specials/Xows_page.java index 89fe91cf0..11287f6a8 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_page.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_page.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.xowa.specials; import gplx.*; import gplx.xowa.*; public interface Xows_page { - void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl); + void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl); } 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 298e19fec..0f97e36e3 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 @@ -67,7 +67,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page public Xowd_page_itm Rslt_nxt() {return rslt_nxt;} public void Rslt_nxt_(Xowd_page_itm v) {rslt_nxt = v;} private Xowd_page_itm rslt_nxt; public int Rslt_list_len() {return rslt_list_len;} public void Rslt_list_len_(int v) {rslt_list_len = v;} private int rslt_list_len; public Xowd_page_itm[] Rslt_list_ttls() {return rslt_list_ttls;} private Xowd_page_itm[] rslt_list_ttls; - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { wiki.Ctx().Cur_page().Html_data().Display_ttl_(wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_sp_allpages_hdr)); url.Page_bry_(Bry_.Add(Bry_.new_ascii_("Special:"), ttl.Page_txt_wo_qargs())); // HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 if (wiki.Domain_tid() == Xow_domain_.Tid_int_home) {wiki.Appe().Usr_dlg().Prog_many(GRP_KEY, "home.invalid", "AllPages not implemented for home wiki"); return;} 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 34895d09c..c67d194ff 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 @@ -172,7 +172,7 @@ class Xows_page_allpages_fxt { Xoa_url_parser parserx = new Xoa_url_parser(); parserx.Parse(init_url, Xows_page_allpages.Ttl_full_bry); Xoa_ttl init_ttl = Make_init_ttl(); - allpages.Special_gen(init_url, wiki.Ctx().Cur_page(), wiki, init_ttl); + allpages.Special_gen(wiki, wiki.Ctx().Cur_page(), init_url, init_ttl); if (expd_display_ttl != null) Tfds.Eq(expd_display_ttl, String_.new_utf8_(wiki.Ctx().Cur_page().Html_data().Display_ttl())); if (expd_address_page != null) Tfds.Eq(expd_address_page, String_.new_utf8_(init_url.Page_bry())); return this; 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 ddd6f4600..b34c793ce 100644 --- a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java +++ b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java @@ -21,8 +21,8 @@ public class Move_page implements Xows_page { private Move_trg_ns_list_fmtr ns_list_fmtr = new Move_trg_ns_list_fmtr(); private Move_url_args args = new Move_url_args(); private Xoa_ttl src_ttl; - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { - args.Parse(calling_url); + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { + args.Parse(url); byte[] src_ttl_bry = args.Src_ttl(); src_ttl = Xoa_ttl.parse_(wiki, src_ttl_bry); if (args.Submitted()) { diff --git a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java index 97087316f..11a739be1 100644 --- a/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/nearby/Nearby_mgr.java @@ -27,7 +27,7 @@ public class Nearby_mgr implements Xows_page { // int pages_count = 0; Bry_bfr tmp_bfr = Bry_bfr.new_(); public int Results_max() {return results_max;} public Nearby_mgr Results_max_(int v) {results_max = v; return this;} private int results_max = 1; - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { page.Data_raw_(Bld_html(wiki)); page.Html_data().Html_restricted_n_(); // [[Special:]] pages allow all HTML // wiki.ParsePage(page, false); // do not clear else previous Search_text will be lost diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page.java b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page.java index 09fae6a83..50394a80a 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.specials.randoms; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; public class Xop_randomRootPage_page implements Xows_page { - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { Xow_ns ns = wiki.Ns_mgr().Names_get_or_main(ttl.Rest_txt()); byte[] random_ttl_bry = wiki.Db_mgr().Load_mgr().Find_random_ttl(ns); byte[] root_bry = Xoa_ttl.parse_(wiki, random_ttl_bry).Root_txt(); diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java index 5c7d30831..905d49f43 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java @@ -49,7 +49,7 @@ class Xop_randomRootPage_page_fxt { page.Url_(url); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_ascii_(special_url)); page.Ttl_(ttl); - special_page.Special_gen(url, page, wiki, ttl); + special_page.Special_gen(wiki, page, url, ttl); return page; } } diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Xows_page_random.java b/400_xowa/src/gplx/xowa/specials/randoms/Xows_page_random.java index 438e619c4..1b95ef5af 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Xows_page_random.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Xows_page_random.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.specials.randoms; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; public class Xows_page_random implements Xows_page { public Xows_page_random(Xowe_wiki wiki) {} - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { Xow_ns ns = wiki.Ns_mgr().Names_get_or_main(ttl.Rest_txt()); byte[] random_ttl_bry = wiki.Db_mgr().Load_mgr().Find_random_ttl(ns); wiki.Data_mgr().Redirect(page, ns.Gen_ttl(random_ttl_bry)); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xobl_regy_itm.java b/400_xowa/src/gplx/xowa/specials/search/Xobl_regy_itm.java deleted file mode 100644 index a194fcc7e..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xobl_regy_itm.java +++ /dev/null @@ -1,57 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -class Xobl_regy_itm { - public Xobl_regy_itm(int id, byte[] bgn, byte[] end, int count) {this.id = id; this.bgn = bgn; this.end = end; this.count = count;} - public int Id() {return id;} private int id; - public byte[] Bgn() {return bgn;} private byte[] bgn; - public byte[] End() {return end;} private byte[] end; - public int Count() {return count;} private int count; - public void Srl_save(Bry_bfr bfr) { - bfr .Add_int_variable(id) .Add_byte_pipe() - .Add(bgn) .Add_byte_pipe() - .Add(end) .Add_byte_pipe() - .Add_int_variable(count).Add_byte_nl() - ; - } -} -class Xobl_search_ttl implements Xobl_data_itm { - public Xobl_search_ttl() {} - public Xobl_search_ttl(byte[] word, Xobl_search_ttl_page[] pages) {this.word = word; this.pages = pages;} - public byte[] Word() {return word;} private byte[] word; - public Xobl_search_ttl_page[] Pages() {return pages;} private Xobl_search_ttl_page[] pages; - public void Srl_save(Bry_bfr bfr) { - bfr.Add(word); - int pages_len = pages.length; - for (int i = 0; i < pages_len; i++) { - bfr.Add_byte_pipe(); - pages[i].Srl_save(bfr); - } - bfr.Add_byte_nl(); - } -} -class Xobl_search_ttl_page { - public Xobl_search_ttl_page(int id, int len) {this.id = id; this.len = len;} - public int Id() {return id;} private int id; - public int Len() {return len;} private int len; - public void Srl_save(Bry_bfr bfr) { - bfr .Add_base85_len_5(id).Add_byte(Byte_ascii.Semic) - .Add_base85_len_5(len) - ; - } -} 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 index 8069ddafe..7dd895f22 100644 --- 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 @@ -18,6 +18,7 @@ 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.*; 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); ListAdp rslts_1 = ListAdp_.new_(), rslts_2 = ListAdp_.new_(); @@ -25,7 +26,7 @@ class Xog_search_suggest_cmd implements GfoInvkAble, Cancelable { 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 Xowe_wiki wiki; private byte[] search_bry; private Xosrh_page_mgr searcher; private int max_results, all_pages_extend, all_pages_min; + } private byte search_mode; public byte[] Search_bry() {return search_bry;} public boolean Canceled() {return canceled;} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java index 0598b8821..892d305aa 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.gfui.*; import gplx.threads.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.web.js.*; public class Xog_search_suggest_mgr implements GfoInvkAble { public Xog_search_suggest_mgr(Xoa_gui_mgr gui_mgr) { this.app = gui_mgr.App(); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java deleted file mode 100644 index 3fbeadbef..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java +++ /dev/null @@ -1,128 +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.*; -public class Xosrh_core implements GfoInvkAble, Xows_page { - public Xosrh_core(Xowe_wiki wiki) {this.wiki = wiki;} - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; - @gplx.Internal protected Xosrh_args_mgr Args_mgr() {return args_mgr;} private Xosrh_args_mgr args_mgr = new Xosrh_args_mgr(); - @gplx.Internal protected Xosrh_html_mgr Html_mgr() {return html_mgr;} private Xosrh_html_mgr html_mgr = new Xosrh_html_mgr(); - public Xosrh_page_mgr Page_mgr() {return page_mgr;} private Xosrh_page_mgr page_mgr = new Xosrh_page_mgr(); - public Xosrh_rslt_grp Cur_grp() {return cur_grp;} private Xosrh_rslt_grp cur_grp; - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, 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 - Xog_search_suggest_mgr search_suggest_mgr = wiki.Appe().Gui_mgr().Search_suggest_mgr(); - args_mgr.Clear(); - Gfo_url_arg[] args_default = search_suggest_mgr.Args_default(); - if (args_default.length > 0) args_mgr.Parse(args_default); - args_mgr.Parse(url.Args()); - byte[] search_bry = args_mgr.Search_bry(); - if (search_bry == null) { - search_bry = ttl.Leaf_txt_wo_qarg(); // leaf has page name; EX: Special:Search/William Shakespeare - args_mgr.Search_bry_(search_bry); - } - if ( search_suggest_mgr.Auto_wildcard() - && wiki.Db_mgr().Tid() == gplx.xowa.dbs.Xodb_mgr_sql.Tid_sql // only apply to sql - && Bry_finder.Find_fwd(search_bry, Byte_ascii.Asterisk) == -1 // search term does not have asterisk - ) - search_bry = Bry_.Add_w_dlm(Byte_ascii.Asterisk, search_bry, Bry_.Empty); - url.Page_bry_(Bry_.Add(Bry_.new_ascii_("Special:Search/"), search_bry)); // HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 - Xoa_ttl page_ttl = Xoa_ttl.parse_(wiki, search_bry); - Xoae_page find_page = page; - if (!Bry_.Eq(search_bry, Bry_page_name)) // do not lookup page else stack overflow; happens when going directly to Special:Search (from history) - find_page = wiki.Data_mgr().Get_page(page_ttl, false); // lookup page - if (find_page.Missing() || url.Search_fulltext()) { // page not found, or explicit_search invoked - Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); - int page_idx = args_mgr.Page_idx(); - Sort_tid(args_mgr.Sort_tid()); - page_mgr.Ns_mgr_(args_mgr.Ns_mgr()); - cur_grp = page_mgr.Search(tmp_bfr, wiki, search_bry, page_idx, page_mgr); - html_mgr.Bld_html(tmp_bfr, this, cur_grp, search_bry, page_idx, page_mgr.Pages_len()); - page.Data_raw_(tmp_bfr.To_bry_and_rls()); - wiki.ParsePage(page, false); // do not clear else previous Search_text will be lost - page.Html_data().Xtn_search_text_(search_bry); - } - else { // page found; return it; - wiki.ParsePage(find_page, true); - page.Data_raw_(find_page.Data_raw()); - if (page.Root() != null) // NOTE: null when going from w:Earth -> q:Earth; DATE:2013-03-20 - page.Root().Data_htm_(find_page.Root().Data_htm()); - page.Ttl_(page_ttl).Url_(Xoa_url.new_(wiki.Domain_bry(), page_ttl.Full_txt())).Redirected_(true); - } - } static final byte[] Bry_page_name = Bry_.new_ascii_("Special:Search"); - private void Sort_tid(byte v) { - switch (v) { - case Xosrh_rslt_itm_sorter.Tid_none: - if (!page_mgr.Prv_search_is_same(args_mgr.Search_bry(), args_mgr.Ns_mgr().Xto_hash_key())) // new search; reset sort to len dsc - page_mgr.Sort_tid_(Xosrh_rslt_itm_sorter.Tid_len_dsc); - break; - default: - page_mgr.Sort_tid_(v); - break; - } - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_itms_per_page_)) page_mgr.Itms_per_page_(m.ReadInt("v")); - else if (ctx.Match(k, Invk_html)) return html_mgr; - else return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_itms_per_page_ = "itms_per_page_", Invk_html = "html"; - 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; -} -class Xosrh_args_mgr { - public byte[] Search_bry() {return search_bry;} public Xosrh_args_mgr Search_bry_(byte[] v) {search_bry = v; return this;} private byte[] search_bry; - public int Page_idx() {return page_idx;} private int page_idx; - public byte Sort_tid() {return sort_tid;} public Xosrh_args_mgr Sort_tid_(byte v) {sort_tid = v; return this;} private byte sort_tid; - public Xosrh_ns_mgr Ns_mgr() {return ns_mgr;} private Xosrh_ns_mgr ns_mgr = new Xosrh_ns_mgr(); - public Xosrh_args_mgr Clear() { - this.search_bry = null; - page_idx = 0; - sort_tid = Xosrh_rslt_itm_sorter.Tid_none; - ns_mgr.Clear(); - return this; - } - public void Parse(Gfo_url_arg[] args_mgr) { - if (args_mgr == null) return; - int len = args_mgr.length; - for (int i = 0; i < len; i++) { - Gfo_url_arg arg = args_mgr[i]; - byte[] key = arg.Key_bry(); - Object tid = url_args.Fetch(key); - if (tid != null) { - switch (((Byte_obj_val)tid).Val()) { - case Arg_search: search_bry = Bry_.Replace(arg.Val_bry(), Byte_ascii.Plus, Byte_ascii.Space); break; - case Arg_page_idx: page_idx = Bry_.Xto_int_or(arg.Val_bry(), 0); break; - case Arg_sort: sort_tid = Xosrh_rslt_itm_sorter.parse_(String_.new_ascii_(arg.Val_bry())); break; - default: break; - } - } - else { - if (Bry_.HasAtBgn(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; - private static byte[] Ns_bry = Bry_.new_ascii_("ns"); - private static final Hash_adp_bry url_args = Hash_adp_bry.ci_ascii_() - .Add_str_byte("xowa_page_index", Arg_page_idx) - .Add_str_byte("xowa_sort", Arg_sort) - .Add_str_byte("search", Arg_search) - ; -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java index f5926c4ed..fe07fc0d3 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java @@ -15,205 +15,206 @@ 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.tdbs.*; import 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() { - fxt.Init_basic(); - fxt.Test_search_exact("b2", "B2_22", "B2_12", "B2__2"); - fxt.Test_search_exact("a" , "A___0"); - fxt.Test_search_exact("b1a"); // missing: mid - 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); - fxt.Test_search("b*", 0, "B3_23"); - fxt.Test_search("b*", 1, "B2_22"); - fxt.Test_search("b*", 2, "B1_21"); - fxt.Test_search("b*", 3, "B3_13"); - } - @Test public void Url() { - Xoa_url url = Xoa_url_parser.Parse_url(fxt.App(), fxt.Wiki(), "Special:Search/Abc?fulltext=y&xowa_sort=len_desc"); - 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()); - } - @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 -// fxt.Test_url_search_bry("Special:Search/Abc?fulltext=y" , "Abc"); // leaf - fxt.Test_url_search_bry("Special:Search/Abc?fulltext=y&search=Def" , "Def"); // leaf overrides query arg - } - @Test public void Url_ns() { - fxt.Test_url__ns("Special:Search?search=Abc&ns0=1&ns1=1", "0|1"); - fxt.Test_url__ns("Special:Search?search=Abc&ns*=1", "*"); - fxt.Test_url__ns("Special:Search?search=Abc", "0"); - } - @Test public void Html() { - fxt.Init_basic(); - fxt.Test_html_by_url("B1", "", String_.Concat_lines_nl - ( "Result '''1''' of '''3''' for '''B1'''
" - , "{|" - , "|-" - , "| [[Special:Search/B1?fulltext=y&xowa_page_index=0|<]]" - , "| [[Special:Search/B1?fulltext=y&xowa_page_index=1|>]]" - , "|-" - , "| [[Special:Search/B1?fulltext=y&xowa_sort=len_desc|length]]" - , "| [[Special:Search/B1?fulltext=y&xowa_sort=title_asc|title]]" - , "|-" - , "| 42 || [[B1 21]]" - , "|-" - , "| 22 || [[B1 11]]" - , "|-" - , "| 2 || [[B1 1]]" - , "|-" - , "| [[Special:Search/B1?fulltext=y&xowa_page_index=0|<]]" - , "| [[Special:Search/B1?fulltext=y&xowa_page_index=1|>]]" - , "|}" - )); - } -// @Test public void Page_next() { +//namespace gplx.xowa.specials.search { +// import org.junit.*; using gplx.xowa.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() { // fxt.Init_basic(); -// fxt.Search_mgr().Page_size_(1); -// fxt.Test_search(Xosrh_core.Match_tid_all, "B1", 0, "B1 1"); -// fxt.Test_search(Xosrh_core.Match_tid_all, "B1", 1, "B1 11"); +// fxt.Test_search_exact("b2", "B2_22", "B2_12", "B2__2"); +// fxt.Test_search_exact("a" , "A___0"); +// fxt.Test_search_exact("b1a"); // missing: mid +// 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 Misc_url() { +// @Test public void Page_size() { // fxt.Init_basic(); -// fxt.Search_mgr().Page_size_(1); -// fxt.Expd_address_page_("Special:Search/B1"); -// fxt.Test_search(Xosrh_core.Match_tid_all, "B1", 0, "B1 1"); +// fxt.Search_mgr().Page_mgr().Itms_per_page_(1); +// fxt.Test_search("b*", 0, "B3_23"); +// fxt.Test_search("b*", 1, "B2_22"); +// fxt.Test_search("b*", 2, "B1_21"); +// fxt.Test_search("b*", 3, "B3_13"); // } - @Test public void Sort_defaults_to_len_desc() { - fxt.Init_basic(); - fxt.Search_mgr().Page_mgr().Itms_per_page_(3); - fxt.Test_search2(Xosrh_core.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(Xosrh_core.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(Xosrh_core.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 - } -} -class Xos_search_mgr_fxt { - Xoae_app app; Xowe_wiki wiki; Bry_bfr bfr = Bry_bfr.reset_(500); Xosrh_core 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_utf8_(bgn), Bry_.new_utf8_(end), count);} - public Xowd_page_itm data_ttl_(int id, String ttl) {return data_ttl_(id, 0, 0, false, 0, ttl);} - public Xowd_page_itm data_ttl_(int id, int fil, int row, boolean redirect, int len, String ttl) {return new Xowd_page_itm().Init(id, Bry_.new_utf8_(ttl), redirect, len, fil, row);} - public Xowd_page_itm data_id_(int id, String ttl) {return data_id_(id, Xow_ns_.Id_main, ttl);} - public Xowd_page_itm data_id_(int id, int ns, String ttl) {return new Xowd_page_itm().Id_(id).Ns_id_(ns).Ttl_page_db_(Bry_.new_utf8_(ttl)).Text_db_id_(0).Text_len_(0);} - public Xobl_search_ttl data_sttl_(String word, int... ids) {return new Xobl_search_ttl(Bry_.new_utf8_(word), data_ttl_word_page_ary_(ids));} - public Xobl_search_ttl_page[] data_ttl_word_page_ary_(int... ids) { - int ids_len = ids.length; - Xobl_search_ttl_page[] rv = new Xobl_search_ttl_page[ids_len]; - for (int i = 0; i < ids_len; i++) { - int id = ids[i]; - rv[i] = new Xobl_search_ttl_page(id, id * 2); - } - return rv; - } - public void Init_regy_site(byte dir_info, Xobl_regy_itm... ary) {Init_regy(wiki.Tdb_fsys_mgr().Url_site_reg(dir_info), ary);} - public void Init_regy_ns (String ns_num, byte tid, Xobl_regy_itm... ary) {Init_regy(wiki.Tdb_fsys_mgr().Url_ns_reg(ns_num, tid), ary);} - public void Init_regy(Io_url url, Xobl_regy_itm[] ary) { - int ary_len = ary.length; - for (int i = 0; i < ary_len; i++) { - Xobl_regy_itm itm = ary[i]; - itm.Srl_save(tmp_bfr); - } - Io_mgr._.SaveFilBfr(url, tmp_bfr); - } private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); - public void Init_data(Io_url fil, Xobl_data_itm... ary) { - Xob_xdat_file xdat_file = new Xob_xdat_file(); - int ary_len = ary.length; - for (int i = 0; i < ary_len; i++) { - Xobl_data_itm itm = ary[i]; - itm.Srl_save(tmp_bfr); - xdat_file.Insert(bfr, tmp_bfr.Xto_bry_and_clear()); - } - xdat_file.Save(fil); - } - public void Init_basic() { - this.Init_regy_ns(wiki.Ns_mgr().Ns_main().Num_str(), Xotdb_dir_info_.Tid_search_ttl, this.regy_itm_(0, "A", "C", 5)); - this.Init_data(wiki.Tdb_fsys_mgr().Url_ns_fil(Xotdb_dir_info_.Tid_search_ttl, Xow_ns_.Id_main, 0) - , this.data_sttl_("a" , 0) - , this.data_sttl_("b1" , 1, 11, 21) - , this.data_sttl_("b2" , 2, 12, 22) - , this.data_sttl_("b3" , 3, 13, 23) - , this.data_sttl_("c" , 4) - ); - this.Init_regy_site(Xotdb_dir_info_.Tid_id, this.regy_itm_(0, "A", "C", 11)); - this.Init_data(wiki.Tdb_fsys_mgr().Url_site_fil(Xotdb_dir_info_.Tid_id, 0) - , this.data_id_( 0, "A___0") - , this.data_id_( 1, "B1__1") - , this.data_id_( 2, "B2__2") - , this.data_id_( 3, "B3__3") - , this.data_id_( 4, "C___4") - , this.data_id_(11, "B1_11") - , this.data_id_(12, "B2_12") - , this.data_id_(13, "B3_13") - , this.data_id_(21, "B1_21") - , this.data_id_(22, "B2_22") - , this.data_id_(23, "B3_23") - ); - search_mgr.Page_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); - } - public void Clear() { - Io_mgr._.InitEngine_mem(); - app = Xoa_app_fxt.app_(); - wiki = Xoa_app_fxt.wiki_tst_(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 Xosrh_core Search_mgr() {return search_mgr;} - public void Test_url_search_bry(String url_str, String expd) { - Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); - search_mgr.Args_mgr().Clear().Parse(url.Args()); - Tfds.Eq(expd, String_.new_utf8_(search_mgr.Args_mgr().Search_bry())); - } - public void Test_url__ns(String url_str, String expd) { - Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); - search_mgr.Args_mgr().Clear().Parse(url.Args()); - Tfds.Eq(expd, String_.new_ascii_(search_mgr.Args_mgr().Ns_mgr().Xto_hash_key())); - } - public void Test_search_exact(String ttl_str, String... expd_ary) {Test_search(ttl_str, 0, expd_ary);} - public void Test_search_match_bgn(String ttl_str, String... expd_ary) {Test_search(ttl_str, 0, expd_ary);} - public void Test_search(String ttl_str, int page_idx, String... expd_ary) { - byte[] ttl_bry = Bry_.new_ascii_(ttl_str); - Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128(); - Xosrh_rslt_grp page = search_mgr.Page_mgr().Search(bfr, wiki, ttl_bry, page_idx, search_mgr.Page_mgr()); - bfr.Mkr_rls(); - Tfds.Eq_ary(expd_ary, Search_itms_to_int_ary(page)); - } - public void Test_html_by_url(String ttl_str, String args_str, String expd_html) { - wiki.Init_needed_(false); - byte[] ttl_bry = Bry_.new_ascii_(ttl_str); - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry); - Xoae_page page = Xoae_page.test_(wiki, ttl); - byte[] url_bry = Bry_.new_utf8_("http://en.wikipedia.org/wiki/Special:Search/" + ttl_str + args_str); - Xoa_url url = wiki.Appe().Url_parser().Parse(url_bry); - search_mgr.Special_gen(url, page, wiki, ttl); - Tfds.Eq_str_lines(expd_html, String_.new_utf8_(page.Root().Data_htm())); - } - public void Test_search2(byte match_tid, String ttl_str, int page_idx, byte sort_tid, String... expd_ary) { - Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128(); - Xoa_url_parser url_parser = new Xoa_url_parser(); - byte[] url_raw = Bry_.new_ascii_("Special:Search/" + ttl_str + ((match_tid == Xosrh_core.Match_tid_all) ? "" : "*") + "?fulltext=y" + Xosrh_rslt_itm_sorter.Xto_url_arg(sort_tid) + "&xowa_page_size=1&xowa_page_index=" + page_idx); - Xoa_url url = url_parser.Parse(url_raw); - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url_raw); - Xoae_page page = wiki.Ctx().Cur_page(); - search_mgr.Special_gen(url, page, wiki, ttl); - Xosrh_rslt_grp cur_grp = search_mgr.Cur_grp(); - bfr.Mkr_rls(); - Tfds.Eq_ary(expd_ary, Search_itms_to_int_ary(cur_grp)); - } - String[] Search_itms_to_int_ary(Xosrh_rslt_grp page) { - int itms_len = page.Itms_len(); - String[] rv = new String[itms_len]; - for (int i = 0; i < itms_len; i++) { - Xowd_page_itm itm = page.Itms_get_at(i); - rv[i] = String_.new_utf8_(itm.Ttl_page_db()); - } - return rv; - } -} +// @Test public void Url() { +// Xoa_url url = Xoa_url_parser.Parse_url(fxt.App(), fxt.Wiki(), "Special:Search/Abc?fulltext=y&xowa_sort=len_desc"); +// 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()); +// } +// @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 +//// fxt.Test_url_search_bry("Special:Search/Abc?fulltext=y" , "Abc"); // leaf +// fxt.Test_url_search_bry("Special:Search/Abc?fulltext=y&search=Def" , "Def"); // leaf overrides query arg +// } +// @Test public void Url_ns() { +// fxt.Test_url__ns("Special:Search?search=Abc&ns0=1&ns1=1", "0|1"); +// fxt.Test_url__ns("Special:Search?search=Abc&ns*=1", "*"); +// fxt.Test_url__ns("Special:Search?search=Abc", "0"); +// } +// @Test public void Html() { +// fxt.Init_basic(); +// fxt.Test_html_by_url("B1", "", String_.Concat_lines_nl +// ( "Result '''1''' of '''3''' for '''B1'''
" +// , "{|" +// , "|-" +// , "| [[Special:Search/B1?fulltext=y&xowa_page_index=0|<]]" +// , "| [[Special:Search/B1?fulltext=y&xowa_page_index=1|>]]" +// , "|-" +// , "| [[Special:Search/B1?fulltext=y&xowa_sort=len_desc|length]]" +// , "| [[Special:Search/B1?fulltext=y&xowa_sort=title_asc|title]]" +// , "|-" +// , "| 42 || [[B1 21]]" +// , "|-" +// , "| 22 || [[B1 11]]" +// , "|-" +// , "| 2 || [[B1 1]]" +// , "|-" +// , "| [[Special:Search/B1?fulltext=y&xowa_page_index=0|<]]" +// , "| [[Special:Search/B1?fulltext=y&xowa_page_index=1|>]]" +// , "|}" +// )); +// } +//// @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"); +//// } +//// @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"); +//// } +// @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 +// } +// } +// class Xos_search_mgr_fxt { +// Xoae_app app; Xowe_wiki wiki; Bry_bfr bfr = Bry_bfr.reset_(500); Xows_page__search 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_utf8_(bgn), Bry_.new_utf8_(end), count);} +// public Xowd_page_itm data_ttl_(int id, String ttl) {return data_ttl_(id, 0, 0, false, 0, ttl);} +// public Xowd_page_itm data_ttl_(int id, int fil, int row, boolean redirect, int len, String ttl) {return new Xowd_page_itm().Init(id, Bry_.new_utf8_(ttl), redirect, len, fil, row);} +// public Xowd_page_itm data_id_(int id, String ttl) {return data_id_(id, Xow_ns_.Id_main, ttl);} +// public Xowd_page_itm data_id_(int id, int ns, String ttl) {return new Xowd_page_itm().Id_(id).Ns_id_(ns).Ttl_page_db_(Bry_.new_utf8_(ttl)).Text_db_id_(0).Text_len_(0);} +// public Xobl_search_ttl data_sttl_(String word, params int[] ids) {return new Xobl_search_ttl(Bry_.new_utf8_(word), data_ttl_word_page_ary_(ids));} +// public Xobl_search_ttl_page[] data_ttl_word_page_ary_(params int[] ids) { +// int ids_len = ids.length; +// Xobl_search_ttl_page[] rv = new Xobl_search_ttl_page[ids_len]; +// for (int i = 0; i < ids_len; i++) { +// int id = ids[i]; +// rv[i] = new Xobl_search_ttl_page(id, id * 2); +// } +// return rv; +// } +// public void Init_regy_site(byte dir_info, params Xobl_regy_itm[] ary) {Init_regy(wiki.Tdb_fsys_mgr().Url_site_reg(dir_info), ary);} +// public void Init_regy_ns (String ns_num, byte tid, params Xobl_regy_itm[] ary) {Init_regy(wiki.Tdb_fsys_mgr().Url_ns_reg(ns_num, tid), ary);} +// public void Init_regy(Io_url url, Xobl_regy_itm[] ary) { +// int ary_len = ary.length; +// for (int i = 0; i < ary_len; i++) { +// Xobl_regy_itm itm = ary[i]; +// itm.Srl_save(tmp_bfr); +// } +// Io_mgr._.SaveFilBfr(url, tmp_bfr); +// } private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); +// public void Init_data(Io_url fil, params Xobl_data_itm[] ary) { +// Xob_xdat_file xdat_file = new Xob_xdat_file(); +// int ary_len = ary.length; +// for (int i = 0; i < ary_len; i++) { +// Xobl_data_itm itm = ary[i]; +// itm.Srl_save(tmp_bfr); +// xdat_file.Insert(bfr, tmp_bfr.Xto_bry_and_clear()); +// } +// xdat_file.Save(fil); +// } +// public void Init_basic() { +// this.Init_regy_ns(wiki.Ns_mgr().Ns_main().Num_str(), Xotdb_dir_info_.Tid_search_ttl, this.regy_itm_(0, "A", "C", 5)); +// this.Init_data(wiki.Tdb_fsys_mgr().Url_ns_fil(Xotdb_dir_info_.Tid_search_ttl, Xow_ns_.Id_main, 0) +// , this.data_sttl_("a" , 0) +// , this.data_sttl_("b1" , 1, 11, 21) +// , this.data_sttl_("b2" , 2, 12, 22) +// , this.data_sttl_("b3" , 3, 13, 23) +// , this.data_sttl_("c" , 4) +// ); +// this.Init_regy_site(Xotdb_dir_info_.Tid_id, this.regy_itm_(0, "A", "C", 11)); +// this.Init_data(wiki.Tdb_fsys_mgr().Url_site_fil(Xotdb_dir_info_.Tid_id, 0) +// , this.data_id_( 0, "A___0") +// , this.data_id_( 1, "B1__1") +// , this.data_id_( 2, "B2__2") +// , this.data_id_( 3, "B3__3") +// , this.data_id_( 4, "C___4") +// , this.data_id_(11, "B1_11") +// , this.data_id_(12, "B2_12") +// , this.data_id_(13, "B3_13") +// , this.data_id_(21, "B1_21") +// , this.data_id_(22, "B2_22") +// , this.data_id_(23, "B3_23") +// ); +// search_mgr.Page_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); +// } +// public void Clear() { +// Io_mgr._.InitEngine_mem(); +// app = Xoa_app_fxt.app_(); +// wiki = Xoa_app_fxt.wiki_tst_(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 void Test_url_search_bry(String url_str, String expd) { +// Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); +// search_mgr.Args_mgr().Clear().Parse(url.Args()); +// Tfds.Eq(expd, String_.new_utf8_(search_mgr.Args_mgr().Search_bry())); +// } +// public void Test_url__ns(String url_str, String expd) { +// Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, url_str); +// search_mgr.Args_mgr().Clear().Parse(url.Args()); +// Tfds.Eq(expd, String_.new_ascii_(search_mgr.Args_mgr().Ns_mgr().Xto_hash_key())); +// } +// public void Test_search_exact(String ttl_str, params String[] expd_ary) {Test_search(ttl_str, 0, expd_ary);} +// public void Test_search_match_bgn(String ttl_str, params String[] expd_ary) {Test_search(ttl_str, 0, expd_ary);} +// public void Test_search(String ttl_str, int page_idx, params String[] expd_ary) { +// byte[] ttl_bry = Bry_.new_ascii_(ttl_str); +// Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128(); +// Xosrh_rslt_grp page = search_mgr.Page_mgr().Search(bfr, wiki, ttl_bry, page_idx, search_mgr.Page_mgr()); +// bfr.Mkr_rls(); +// Tfds.Eq_ary(expd_ary, Search_itms_to_int_ary(page)); +// } +// public void Test_html_by_url(String ttl_str, String args_str, String expd_html) { +// wiki.Init_needed_(false); +// byte[] ttl_bry = Bry_.new_ascii_(ttl_str); +// Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry); +// Xoae_page page = Xoae_page.test_(wiki, ttl); +// byte[] url_bry = Bry_.new_utf8_("http://en.wikipedia.org/wiki/Special:Search/" + ttl_str + args_str); +// Xoa_url url = wiki.Appe().Url_parser().Parse(url_bry); +// search_mgr.Special_gen(url, page, wiki, ttl); +// Tfds.Eq_str_lines(expd_html, String_.new_utf8_(page.Root().Data_htm())); +// } +// public void Test_search2(byte match_tid, String ttl_str, int page_idx, byte sort_tid, params String[] expd_ary) { +// Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128(); +// Xoa_url_parser url_parser = new Xoa_url_parser(); +// byte[] url_raw = Bry_.new_ascii_("Special:Search/" + ttl_str + ((match_tid == Xows_page__search.Match_tid_all) ? "" : "*") + "?fulltext=y" + Xosrh_rslt_itm_sorter.Xto_url_arg(sort_tid) + "&xowa_page_size=1&xowa_page_index=" + page_idx); +// Xoa_url url = url_parser.Parse(url_raw); +// Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url_raw); +// Xoae_page page = wiki.Ctx().Cur_page(); +// search_mgr.Special_gen(url, page, wiki, ttl); +// Xosrh_rslt_grp cur_grp = search_mgr.Cur_grp(); +// bfr.Mkr_rls(); +// Tfds.Eq_ary(expd_ary, Search_itms_to_int_ary(cur_grp)); +// } +// String[] Search_itms_to_int_ary(Xosrh_rslt_grp page) { +// int itms_len = page.Itms_len(); +// String[] rv = new String[itms_len]; +// for (int i = 0; i < itms_len; i++) { +// Xowd_page_itm itm = page.Itms_get_at(i); +// rv[i] = String_.new_utf8_(itm.Ttl_page_db()); +// } +// return rv; +// } +// } +//} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java deleted file mode 100644 index 90ac28c28..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java +++ /dev/null @@ -1,79 +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.langs.numbers.*; import gplx.xowa.wikis.data.tbls.*; -class Xosrh_html_mgr implements GfoInvkAble { - public Bry_fmtr Html_all_bgn() {return html_all_bgn;} Bry_fmtr html_all_bgn = Bry_fmtr.new_(String_.Concat_lines_nl - ( "~{search_results_header}
" - , "{|" - , "|-" - , "| [[Special:Search/~{title}?fulltext=y&xowa_page_index=~{page_index_prev}|<]]" - , "| [[Special:Search/~{title}?fulltext=y&xowa_page_index=~{page_index_next}|>]]" - , "|-" - , "| [[Special:Search/~{title}?fulltext=y&xowa_sort=len_desc|length]]" - , "| [[Special:Search/~{title}?fulltext=y&xowa_sort=title_asc|title]]" - ), "search_results_header", "title", "page_index_prev", "page_index_next" - ); - public Bry_fmtr Html_itm() {return html_itm;} Bry_fmtr html_itm = Bry_fmtr.new_(String_.Concat_lines_nl - ( "|-" - , "| ~{length} || [[~{title}]]" - ), "title", "length" - ); - public Bry_fmtr Html_all_end() {return html_all_end;} Bry_fmtr html_all_end = Bry_fmtr.new_(String_.Concat_lines_nl - ( "|-" - , "| [[Special:Search/~{title}?fulltext=y&xowa_page_index=~{page_index_prev}|<]]" - , "| [[Special:Search/~{title}?fulltext=y&xowa_page_index=~{page_index_next}|>]]" - , "|}\n" - ), "title", "page_index_prev", "page_index_next" - ); - public void Bld_html(Bry_bfr bfr, Xosrh_core core, Xosrh_rslt_grp grp, byte[] search_bry, int page_idx, int pages_len) { - int itms_len = grp.Itms_len(); - int xowa_idx_bwd = (page_idx == 0) ? 0 : page_idx - 1; - int xowa_idx_fwd = (page_idx >= pages_len) ? pages_len - 1 : page_idx + 1; - Xowe_wiki wiki = core.Wiki(); - Xol_num_mgr num_mgr = wiki.Lang().Num_mgr(); - int itms_bgn = core.Page_mgr().Itms_bgn() + 1; - if (itms_len == 0) itms_bgn = 0; - byte[] search_results_header = wiki.Msg_mgr().Val_by_id_args(Xol_msg_itm_.Id_search_results_header, num_mgr.Format_num(itms_bgn), num_mgr.Format_num(core.Page_mgr().Itms_end()), num_mgr.Format_num(grp.Itms_total()), search_bry, pages_len); - html_all_bgn.Bld_bfr_many(bfr, search_results_header, search_bry, xowa_idx_bwd, xowa_idx_fwd); - Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); - Bry_bfr tmp_ttl_bfr = core.Wiki().Appe().Utl__bfr_mkr().Get_b512(); - for (int i = 0; i < itms_len; i++) { - Xowd_page_itm itm = grp.Itms_get_at(i); - byte[] itm_ttl = Xoa_ttl.Replace_unders(itm.Ttl_page_db()); - int itm_ns_id = itm.Ns_id(); - if (itm_ns_id != Xow_ns_.Id_main) { - Xow_ns itm_ns = ns_mgr.Ids_get_or_null(itm_ns_id); - tmp_ttl_bfr.Add_byte(Byte_ascii.Colon) // NOTE: need to add : to literalize ns; EX: [[Category:A]] will get thrown into category list; [[:Category:A]] will print - .Add(itm_ns.Name_db_w_colon()) - .Add(itm_ttl); - itm_ttl = tmp_ttl_bfr.Xto_bry_and_clear(); - } - html_itm.Bld_bfr_many(bfr, itm_ttl, itm.Text_len()); - } - html_all_end.Bld_bfr_many(bfr, search_bry, xowa_idx_bwd, xowa_idx_fwd); - tmp_ttl_bfr.Mkr_rls(); - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_all_bgn_)) html_all_bgn.Fmt_(m.ReadBry("v")); - else if (ctx.Match(k, Invk_all_end_)) html_all_end.Fmt_(m.ReadBry("v")); - else if (ctx.Match(k, Invk_itm_)) html_itm.Fmt_(m.ReadBry("v")); - else return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_all_bgn_ = "all_bgn_", Invk_all_end_ = "all_end_", Invk_itm_ = "itm_"; -} 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 index 9b2d7c35f..5d4ec13ff 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java @@ -37,14 +37,14 @@ public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { private Xosrh_rslt_grp[] pages_ary; ListAdp cur_ids = ListAdp_.new_(); private Xosrh_rslt_itm_sorter sorter = new Xosrh_rslt_itm_sorter(); private Xowe_wiki wiki; - public Xosrh_ns_mgr Ns_mgr() {return ns_mgr;} public void Ns_mgr_(Xosrh_ns_mgr v) {ns_mgr = v;} private Xosrh_ns_mgr ns_mgr = new Xosrh_ns_mgr(); + 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.Xto_hash_key())) { // search is same + 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; @@ -54,7 +54,7 @@ public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { ListAdp 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.Xto_hash_key(); + prv_ns_bry = ns_mgr.To_hash_key(); } int ids_len = cur_ids.Count(); if (itms_end > ids_len) itms_end = ids_len; @@ -72,7 +72,7 @@ public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { rv.Itms_total_(cur_ids.Count()); return rv; } - public ListAdp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xosrh_ns_mgr ns_mgr, byte[] search) { + public ListAdp 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._.Parse(search); cur_root.Search(cancelable, bfr, search, wiki, itms_per_page, ns_mgr); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java index 802f77f65..b8bae94dd 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_searcher.java @@ -17,5 +17,5 @@ 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 { - ListAdp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xosrh_ns_mgr ns_Mgr, byte[] search); + ListAdp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xows_ns_mgr ns_Mgr, byte[] search); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java index c35d81910..45aad5345 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java @@ -82,5 +82,5 @@ class Xosrh_page_mgr_fxt { } class Xosrh_page_mgr_searcher_mok implements Xosrh_page_mgr_searcher { public Xosrh_page_mgr_searcher_mok(ListAdp list) {this.list = list;} ListAdp list; - public ListAdp Parse_search_and_load_ids(Cancelable cancelable, Bry_bfr bfr, Xosrh_ns_mgr ns_mgr, byte[] search) {return list;} + public ListAdp 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_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java index a69174b30..6b8c2313b 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java @@ -84,7 +84,7 @@ class Xosearch_searcher_fxt { public void Test_search(String ttl_str, int... expd) { byte[] ttl_bry = Bry_.new_ascii_(ttl_str); Xosrh_qry_itm qry_root = parser.Parse(ttl_bry); - Xosrh_ns_mgr ns_mgr = new Xosrh_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); + 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); 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 index b6a9cae56..ddf8ebed5 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java @@ -45,7 +45,7 @@ class Xosrh_qry_itm { default: throw Err_.unhandled(tid); } } - private static ListAdp Search_word(Xowe_wiki wiki, Cancelable cancelable, Bry_bfr tmp_bfr, Xosrh_ns_mgr ns_mgr, byte[] search_word, int results_max) { + private static ListAdp Search_word(Xowe_wiki wiki, Cancelable cancelable, Bry_bfr tmp_bfr, Xows_ns_mgr ns_mgr, byte[] search_word, int results_max) { ListAdp found = ListAdp_.new_(); byte wiki_db_tid = wiki.Db_mgr().Tid(); if (wiki_db_tid == Xodb_mgr_sql.Tid_sql @@ -66,7 +66,7 @@ class Xosrh_qry_itm { } return rv; } - public void Search(Cancelable cancelable, Bry_bfr tmp_bfr, byte[] src, Xowe_wiki wiki, int results_max, Xosrh_ns_mgr ns_mgr) { + 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; diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java deleted file mode 100644 index cedbf046e..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java +++ /dev/null @@ -1,67 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -class Xow_search_qry { - public Xow_search_qry(byte[] raw, int rslts_bgn, int rslts_len, Xow_search_word[] word_ary, Xow_search_matcher search_matcher) { - this.raw = raw; this.rslts_bgn = rslts_bgn; this.rslts_len = rslts_len; - this.word_ary = word_ary; this.search_matcher = search_matcher; - } - public byte[] Raw() {return raw;} private final byte[] raw; - public Xow_search_matcher Search_matcher() {return search_matcher;} private final Xow_search_matcher search_matcher; - public Xow_search_word[] Word_ary() {return word_ary;} private final Xow_search_word[] word_ary; - public int Rslts_bgn() {return rslts_bgn;} private final int rslts_bgn; - public int Rslts_len() {return rslts_len;} private final int rslts_len; - public int Rslts_end() {return rslts_bgn + rslts_len;} -} -class Xow_search_rslt { - public Xow_search_rslt(byte[] page_key, int page_id, int page_ns, byte[] page_ttl, int page_len) { - this.page_key = page_key; - this.page_id = page_id; - this.page_ns = page_ns; - this.page_ttl = page_ttl; - this.page_len = page_len; - } - public byte[] Page_key() {return page_key;} private final byte[] page_key; - public int Page_id() {return page_id;} private final int page_id; - public int Page_ns() {return page_ns;} private final int page_ns; - public byte[] Page_ttl() {return page_ttl;} private final byte[] page_ttl; - public int Page_len() {return page_len;} private final int page_len; -} -class Xow_search_cache { - private final OrderedHash hash = OrderedHash_.new_bry_(); - public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; - public int Count() {return hash.Count();} - public boolean Has(byte[] key) {return hash.Has(key);} - public void Add(Xow_search_rslt itm) {hash.Add(itm.Page_key(), itm);} - public void Get_between(ListAdp rv, int bgn, int end) { - rv.Clear(); - if (bgn >= hash.Count()) return; - for (int i = bgn; i < end; ++i) { - if (i >= hash.Count()) break; - Xow_search_rslt itm = (Xow_search_rslt)hash.FetchAt(i); - rv.Add(itm); - } - } -} -class Xow_search_word { - public Xow_search_word(byte[] text) {this.text = text;} - public byte[] Text() {return text;} private final byte[] text; - public int Id() {return id;} public void Id_(int v) {id = v;} private int id = -1; - public int Offset() {return offset;} public void Offset_add(int v) {offset += v;} private int offset; - public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.java deleted file mode 100644 index aa864485d..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.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.data.*; import gplx.xowa.wikis.data.tbls.*; -class Xow_search_db { - public void Search(Cancelable cxl, Xow_wiki wiki, Xow_search_qry qry, Xow_search_cache cache) { -// int offset = qry.Rslts_bgn(); -// int limit = qry.Rslts_len(); - int rslts_end = qry.Rslts_end(); - Xow_search_matcher crt = null; - Xow_search_word[] words_ary = qry.Word_ary(); int words_len = words_ary.length; - while (true) { - boolean found_none = Bool_.Y; - for (int i = 0; i < words_len; ++i) { - Xow_search_word word = qry.Word_ary()[i]; - boolean read = Search_db(cxl, wiki, cache, wiki.Data_mgr__core_mgr().Db__core(), wiki.Data_mgr__core_mgr().Db__search(), word, crt); - if (read) found_none = Bool_.N; - } - if (found_none) {cache.Done_y_(); break;} - if (cache.Count() > rslts_end) {break;} - } - } - private boolean Search_db(Cancelable cxl, Xow_wiki wiki, Xow_search_cache cache, Xowd_db_file core_db, Xowd_db_file search_db, Xow_search_word word, Xow_search_matcher crt) { - if (word.Done()) return false; // last db_search for word returned 0 results; don't search again; - // get word_id - Xowd_search_word_tbl word_tbl = search_db.Tbl__search_word(); - int word_id = word.Id(); - if (word_id == Xowd_search_word_tbl.Id_null) { - word_id = word_tbl.Select_id(word.Text()); - if (word_id == Xowd_search_word_tbl.Id_null) { - word.Done_y_(); - Xoa_app_.Usr_dlg().Warn_many("", "", "search:word_id missing; word=~{0}", word); - return Bool_.N; - } - } - // get search results -// Xowd_search_link_tbl link_tbl = search_db.Tbl__search_link(); - Db_attach_rdr attach_rdr = new Db_attach_rdr(search_db.Conn(), "page_db", core_db.Url()); - String sql = String_.Format(Search_sql); - Db_rdr rdr = attach_rdr.Exec_as_rdr(sql); - Xowd_page_tbl page_tbl = core_db.Tbl__page(); - Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); - boolean read = false; - while (rdr.Move_next()) { - read = true; - byte[] page_ttl = rdr.Read_bry(page_tbl.Fld_page_title()); - if (!crt.Matches(page_ttl)) continue; // ttl doesn't match crt; ignore; - int page_id = rdr.Read_int(page_tbl.Fld_page_id()); - int page_ns = rdr.Read_int(page_tbl.Fld_page_ns()); - int page_len = rdr.Read_int(page_tbl.Fld_page_len()); - Xow_ns ns = ns_mgr.Ids_get_or_null(page_ns); - byte[] page_key = ns.Gen_ttl(page_ttl); - if (cache.Has(page_key)) continue; // page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" - cache.Add(new Xow_search_rslt(page_key, page_id, page_ns, page_ttl, page_len)); - } - attach_rdr.Rls(); - if (!read) word.Done_y_(); - return read; - } - private static final String Search_sql = String_.Concat_lines_nl_skip_last - ( "SELECT cp.page_id" - , ", cp.page_namespace" - , ", cp.page_title" - , ", cp.page_len" - , "FROM {0} sp" - , " JOIN page cp ON cp.{1} = sp.page_id " - , "WHERE sp.{2} = {3}" - , "ORDER BY {4} {5}" - , "LIMIT {6}" - , "OFFSET {7};" - ); -} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.java deleted file mode 100644 index 33eb0c316..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.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.*; -public class Xow_search_matcher { - public Xow_search_matcher(int tid, byte[] raw, Xow_search_matcher lhs, Xow_search_matcher rhs) { - this.tid = tid; this.raw = raw; this.lhs = lhs; this.rhs = rhs; - } - public int Tid() {return tid;} private final int tid; - public byte[] Raw() {return raw;} private final byte[] raw; - public Xow_search_matcher Lhs() {return lhs;} private final Xow_search_matcher lhs; - public Xow_search_matcher Rhs() {return rhs;} private final Xow_search_matcher rhs; - public boolean Matches(byte[] src) { - switch (tid) { - case Xow_search_matcher.Tid_word: - case Xow_search_matcher.Tid_word_quote: - return Bry_finder.Find_fwd(src, raw) != Bry_finder.Not_found; - case Xow_search_matcher.Tid_not: - return !lhs.Matches(src); - case Xow_search_matcher.Tid_or: - return lhs.Matches(src) || rhs.Matches(src); - case Xow_search_matcher.Tid_and: - return lhs.Matches(src) && rhs.Matches(src); - case Xow_search_matcher.Tid_null: return false; - default: throw Err_.unhandled(tid); - } - } - public static final Xow_search_matcher Null = new Xow_search_matcher(Xow_search_matcher.Tid_null, null, null, null); - public static Xow_search_matcher new_join(byte tid, Xow_search_matcher lhs, Xow_search_matcher rhs) {return new Xow_search_matcher(tid, null, lhs, rhs);} - public static final int - Tid_word = 0 - , Tid_and = 1 - , Tid_or = 2 - , Tid_not = 3 - , Tid_word_quote = 4 - , Tid_null = 5 - ; -} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.java deleted file mode 100644 index ba6a95a11..000000000 --- a/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; -class Xow_search_mgr { - private final Hash_adp_bry cache_hash = Hash_adp_bry.cs_(); - private final ListAdp rslts_list = ListAdp_.new_(); - private final Xow_search_db db = new Xow_search_db(); - public void Search(Xow_search_ui ui, byte[] raw, int rslt_bgn, int rslt_len, Xoa_wiki_mgr wiki_mgr, byte[]... wiki_domains) { - int len = wiki_domains.length; - for (int i = 0; i < len; ++i) { - if (ui.Canceled()) break; - byte[] wiki_domain = wiki_domains[i]; - Xow_wiki wiki = wiki_mgr.Get_by_key_or_null(wiki_domain); - if (wiki == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "search:wiki not found; wiki=~{0}", wiki_domain); continue;} // wiki listed in search opt, but no longer exists - Search(ui, raw, rslt_bgn, rslt_len, wiki); - } - } - private void Search(Xow_search_ui ui, byte[] raw, int rslt_bgn, int rslt_len, Xow_wiki wiki) { - Xow_search_qry qry = Parse_qry(raw, rslt_bgn, rslt_len); - // get cache or new - byte[] cache_key = Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki.Domain_bry(), raw); - Xow_search_cache cache = (Xow_search_cache)cache_hash.Get_by_bry(cache_key); - if (cache == null) { - cache = new Xow_search_cache(); - cache_hash.Add_bry_obj(cache_key, cache); - } - // fill results - cache.Get_between(rslts_list, qry.Rslts_bgn(), qry.Rslts_end()); - if (qry.Rslts_end() > cache.Count() && !cache.Done()) - db.Search(ui, wiki, qry, cache); - ui.End(); - } - private Xow_search_qry Parse_qry(byte[] raw, int rslt_bgn, int rslt_len) { - return null; - } -} -class Xow_search_ui implements Cancelable { - public boolean Canceled() {return false;} - public void Cancel() {} - public void Cancel_reset() {} - public void Add(Xow_search_rslt rslt) { - } - public void End() { - } -} 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 new file mode 100644 index 000000000..0796c3050 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_arg_mgr.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.core.primitives.*; +class Xows_arg_mgr { + 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_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_url_arg[] arg_ary) { + if (arg_ary == null) return; + int len = arg_ary.length; + for (int i = 0; i < len; ++i) { + Gfo_url_arg arg = arg_ary[i]; + byte[] key = arg.Key_bry(); + Object tid = url_args.Fetch(key); + if (tid != null) { + switch (((Byte_obj_val)tid).Val()) { + case Arg_search: this.search_bry = Bry_.Replace(arg.Val_bry(), Byte_ascii.Plus, Byte_ascii.Space); break; + case Arg_page_idx: this.paging_idx = Bry_.Xto_int_or(arg.Val_bry(), 0); break; + case Arg_sort: this.sort_tid = Xosrh_rslt_itm_sorter.parse_(String_.new_ascii_(arg.Val_bry())); break; + case Arg_cancel: this.cancel = arg.Val_bry(); break; + default: break; + } + } + else { + if (Bry_.HasAtBgn(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; + private static byte[] Ns_bry = Bry_.new_ascii_("ns"); + private static final Hash_adp_bry url_args = Hash_adp_bry.ci_ascii_() + .Add_str_byte("xowa_page_index", Arg_page_idx) + .Add_str_byte("xowa_sort", Arg_sort) + .Add_str_byte("search", Arg_search) + .Add_str_byte("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 new file mode 100644 index 000000000..794ac5cc7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_core.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +class Xows_core { + private final Xoa_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(Xoa_wiki_mgr wiki_mgr) {this.wiki_mgr = wiki_mgr;} + public Xows_db_wkr Db() {return db;} private final Xows_db_wkr db = new Xows_db_wkr(); + public Xows_html_wkr Html_wkr() {return html_wkr;} private final Xows_html_wkr html_wkr = new Xows_html_wkr(); + public Xows_db_cache Get_cache_or_new(byte[] key) { + Xows_db_cache cache = (Xows_db_cache)cache_hash.Get_by_bry(key); + if (cache == null) { + cache = new Xows_db_cache(); + cache_hash.Add_bry_obj(key, cache); + } + return cache; + } + public void Search(Xow_wiki search_wiki, Xoae_page page, Xows_ui_qry qry) { + // generate 1 cmd per wiki + byte[][] domain_ary = qry.Wiki_domains(); int domain_ary_len = domain_ary.length; + for (int i = 0; i < domain_ary_len; ++i) { + byte[] domain = domain_ary[i]; + Xowe_wiki wiki = wiki_mgr.Get_by_key_or_null(domain); if (wiki == null) continue; + Assert_page_count(wiki); + Xows_ui_cmd cmd = new Xows_ui_cmd(this, qry, wiki, page.Tab_data().Close_mgr(), page.Tab_data().Tab().Html_itm()); + qry.Cmds__add(cmd); + } + qry.Page_max_(Int_.MaxValue); + // do search and generate html + html_wkr.Init_by_wiki(search_wiki.Html_mgr__lnki_wtr_utl(), search_wiki.Lang().Num_mgr()); + 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); + cmd_hash.Del(cmd.Key_for_html()); + cmd_hash.Add_bry_obj(cmd.Key_for_html(), cmd); + boolean searching_db = cmd.Search(); + html_wkr.Gen_tbl(tmp_bfr, qry, cmd.Rslt(), cmd.Key_for_html(), cmd.Wiki_domain_bry(), searching_db); + } + page.Data_raw_(html_wkr.Gen_page(qry, tmp_bfr.Xto_bry_and_clear())); + } + public void Search_end(Xows_ui_cmd cmd) { + cmd_hash.Del(cmd.Key_for_html()); + } + 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_for_html()); + } + private void Assert_page_count(Xowe_wiki wiki) { + Xowd_db_file search_db = wiki.Data_mgr__core_mgr().Db__search(); + if (ask_for_upgrade + && Xoa_app_.Mode_is_gui() + && !search_db.Tbl__search_word().Ddl__page_count() + && !upgraded_wikis.Has(wiki.Domain_bry()) ) { + ask_for_upgrade = false; + upgraded_wikis.AddKeyVal(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_cache.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_cache.java new file mode 100644 index 000000000..82e41f9c9 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_cache.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +class Xows_db_cache { + private final OrderedHash hash = OrderedHash_.new_bry_(); + public Xows_db_matcher Matcher() {return matcher;} private Xows_db_matcher matcher; + public Xows_db_word[] Words() {return words;} private Xows_db_word[] words; + public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; + public int Count() {return hash.Count();} + public boolean Has(byte[] key) {return hash.Has(key);} + public void Add(Xows_db_row row) {hash.Add(row.Page_ttl_w_ns(), row);} + public void Get_between(Xows_ui_rslt 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; + Xows_db_row row = (Xows_db_row)hash.FetchAt(i); + search_ui.Add(row); + } + } + public void Sort() {hash.SortBy(Xows_db_row_sorter.Page_len_dsc);} + public void Init_by_db(Cancelable cxl, byte[] raw, gplx.xowa.wikis.data.tbls.Xowd_search_word_tbl word_tbl) { + this.matcher = gplx.xowa.specials.search.parsers.Xow_search_parser.I.Parse(raw); + this.words = Xows_db_matcher_bldr.I.Gather_words_for_db(cxl, matcher, word_tbl); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher.java new file mode 100644 index 000000000..d1f1ce994 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.core.regxs.*; +public class Xows_db_matcher { + private final Gfo_pattern raw_pattern; + public Xows_db_matcher(int tid, byte[] raw, Xows_db_matcher lhs, Xows_db_matcher rhs) { + this.tid = tid; this.raw = raw; this.lhs = lhs; this.rhs = rhs; + this.raw_pattern = Bry_.Has(raw, Byte_ascii.Asterisk) ? new Gfo_pattern(raw) : null; + } + public int Tid() {return tid;} private final int tid; + public int Page_count() {return page_count;} public void Page_count_(int v) {page_count = v;} private int page_count; + public byte[] Raw() {return raw;} private final byte[] raw; + public Xows_db_matcher Lhs() {return lhs;} private final Xows_db_matcher lhs; + public Xows_db_matcher Rhs() {return rhs;} private final Xows_db_matcher rhs; + public boolean Matches(byte[] page_ttl_lc, byte[][] page_ttl_words) { + switch (tid) { + case Xows_db_matcher.Tid_word: { + int len = page_ttl_words.length; + for (int i = 0; i < len; ++i) { + byte[] word = page_ttl_words[i]; + if (raw_pattern == null) { + if (Bry_.Eq(word, raw)) return true; + } + else { + if (raw_pattern.Match(word)) return true; + } + } + return false; + } + case Xows_db_matcher.Tid_word_quote: // note that raw does not have quotes; EX: "B*" -> B* + return Bry_finder.Find_fwd(page_ttl_lc, raw) != Bry_finder.Not_found; + case Xows_db_matcher.Tid_not: + return !rhs.Matches(page_ttl_lc, page_ttl_words); + case Xows_db_matcher.Tid_or: + return lhs.Matches(page_ttl_lc, page_ttl_words) || rhs.Matches(page_ttl_lc, page_ttl_words); + case Xows_db_matcher.Tid_and: + return lhs.Matches(page_ttl_lc, page_ttl_words) && rhs.Matches(page_ttl_lc, page_ttl_words); + case Xows_db_matcher.Tid_null: return false; + default: throw Err_.unhandled(tid); + } + } + public static final Xows_db_matcher Null = new Xows_db_matcher(Xows_db_matcher.Tid_null, null, null, null); + public static Xows_db_matcher new_join(byte tid, Xows_db_matcher lhs, Xows_db_matcher rhs) {return new Xows_db_matcher(tid, null, lhs, rhs);} + public static final int + Tid_word = 0 + , Tid_and = 1 + , Tid_or = 2 + , Tid_not = 3 + , Tid_word_quote = 4 + , Tid_null = 5 + ; +} 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 new file mode 100644 index 000000000..66bc9dcbb --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_matcher_bldr.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.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.xowa.wikis.data.tbls.*; +class Xows_db_matcher_bldr { + public Xows_db_word[] Gather_words_for_db(Cancelable cxl, Xows_db_matcher matcher, Xowd_search_word_tbl word_tbl) { + ListAdp rv = ListAdp_.new_(); + Gather_words_for_db(cxl, matcher, rv, word_tbl); + rv.SortBy(Xows_db_word_sorter.Page_count_dsc); + return (Xows_db_word[])rv.Xto_ary(Xows_db_word.class); + } + public void Gather_words_for_db(Cancelable cxl, Xows_db_matcher matcher, ListAdp rv, Xowd_search_word_tbl word_tbl) { + synchronized (cxl) { + if (cxl.Canceled()) return; + } + switch (matcher.Tid()) { + case Xows_db_matcher.Tid_word: + byte[] word_text = matcher.Raw(); + if (Bry_.Has(word_text, Byte_ascii.Asterisk)) + Load_word_many(cxl, rv, word_text, word_tbl); + else + Load_word_one(rv, word_text, word_tbl); + break; + case Xows_db_matcher.Tid_word_quote: + ListAdp tmp = ListAdp_.new_(); + byte[][] words = Bry_.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.SortBy(Xows_db_word_sorter.Page_count_dsc); + rv.Add(tmp.FetchAt(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 Xows_db_matcher.Tid_and: + ListAdp lhs_tmp = ListAdp_.new_(), rhs_tmp = ListAdp_.new_(); + Gather_words_for_db(cxl, matcher.Lhs(), lhs_tmp, word_tbl); + Gather_words_for_db(cxl, matcher.Rhs(), rhs_tmp, word_tbl); + ListAdp_.Add_list(rv, Calc_lowest(lhs_tmp, rhs_tmp)); // calc side with lowest count; add to rv; + break; + case Xows_db_matcher.Tid_or: + Gather_words_for_db(cxl, matcher.Lhs(), rv, word_tbl); + Gather_words_for_db(cxl, matcher.Rhs(), rv, word_tbl); + break; + case Xows_db_matcher.Tid_not: break; // never add "NOT" to db_search + case Xows_db_matcher.Tid_null: break; // should not happen + default: throw Err_.unhandled(matcher.Tid()); + } + } + private ListAdp Calc_lowest(ListAdp lhs, ListAdp 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(ListAdp list) { + int rv = 0; + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Xows_db_word word = (Xows_db_word)list.FetchAt(i); + rv += word.Page_count(); + } + return rv; + } + private void Load_word_one(ListAdp 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; + Xows_db_word word = new Xows_db_word(row.Id(), row.Text(), row.Page_count()); + rv.Add(word); + } + private void Load_word_many(Cancelable cxl, ListAdp 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 Xows_db_word(row.Id(), row.Text(), row.Page_count())); + } + } + public static final Xows_db_matcher_bldr I = new Xows_db_matcher_bldr(); Xows_db_matcher_bldr() {} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_row.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_row.java new file mode 100644 index 000000000..e4b4e0742 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_row.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +public class Xows_db_row { + public Xows_db_row(byte[] wiki_domain, int page_id, int page_ns, int page_len, byte[] page_ttl_w_ns, byte[] page_ttl_wo_ns) { + this.wiki_domain = wiki_domain; + this.page_id = page_id; + this.page_ns = page_ns; + this.page_len = page_len; + this.page_ttl_w_ns = page_ttl_w_ns; + this.page_ttl_wo_ns = page_ttl_wo_ns; + this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki_domain, page_ttl_w_ns); + } + public byte[] Key() {return key;} private final byte[] key; + public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain; + public int Page_id() {return page_id;} private final int page_id; + public int Page_ns() {return page_ns;} private final int page_ns; + public int Page_len() {return page_len;} private final int page_len; + public byte[] Page_ttl_w_ns() {return page_ttl_w_ns;} private final byte[] page_ttl_w_ns; + public byte[] Page_ttl_wo_ns() {return page_ttl_wo_ns;} private final byte[] page_ttl_wo_ns; + public static Xows_db_row[] Ary(Xows_db_row... v) {return v;} +} +class Xows_db_row_sorter implements gplx.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xows_db_row lhs = (Xows_db_row)lhsObj; + Xows_db_row rhs = (Xows_db_row)rhsObj; + return -Int_.Compare(lhs.Page_len(), rhs.Page_len()); + } + public static final Xows_db_row_sorter Page_len_dsc = new Xows_db_row_sorter(); Xows_db_row_sorter() {} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java new file mode 100644 index 000000000..d0ff25152 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_wkr.java @@ -0,0 +1,106 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.core.primitives.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.gfui.*; +class Xows_db_wkr { + private int total_found; + public void Search(Xows_ui_cmd cmd, Xows_ui_qry qry, Xows_ui_rslt rslt, Xows_db_cache cache, Xow_wiki wiki) { + // init + int itms_wanted = qry.Itms_end() - qry.Itms_bgn(), limit = qry.Page_len(); + Xowd_db_file core_db = wiki.Data_mgr__core_mgr().Db__core(); + Xowd_db_file search_db = wiki.Data_mgr__core_mgr().Db__search(); + // assert matcher + if (cache.Matcher() == null) { + cache.Init_by_db + ( cmd + , wiki.Lang().Case_mgr().Case_build_lower(qry.Search_raw()) // lower-case search + , wiki.Data_mgr__core_mgr().Db__search().Tbl__search_word() + ); + } + // load pages for each word + Xows_db_matcher matcher = cache.Matcher(); + Xows_db_word[] word_ary = cache.Words(); + int word_ary_len = word_ary.length; + total_found = 0; + while (true) { + if (cmd.Canceled()) break; + boolean found_none = true; + for (int i = 0; i < word_ary_len; ++i) { + if (cmd.Canceled()) break;; + Xows_db_word word = word_ary[i]; + int read = Search_pages(cmd, qry, rslt, cache, wiki, core_db, search_db, word, matcher, limit, word.Rslts_offset(), i, word_ary_len); + if (read > 0) found_none = false; + } + if (found_none) {cache.Done_y_(); break;} + if (total_found >= itms_wanted) break; + } + cache.Sort(); + } + private int Search_pages(Xows_ui_cmd cmd, Xows_ui_qry qry, Xows_ui_rslt rslt, Xows_db_cache cache, Xow_wiki wiki, Xowd_db_file core_db, Xowd_db_file search_db, Xows_db_word word, Xows_db_matcher matcher, int limit, int offset, int i, int word_ary_len) { + if (word.Rslts_done()) return 0; // last db_search for word returned 0 results; don't search again; + // get search results + synchronized (cmd) { + if (cmd.Canceled()) return 0; + } + Xoa_app_.Usr_dlg().Prog_many("", "", "searching; total=~{1} offset=~{2} index=~{0} word=~{3}", i, word_ary_len, offset, word.Text()); + Xowd_search_link_tbl link_tbl = search_db.Tbl__search_link(); + Db_attach_rdr attach_rdr = new Db_attach_rdr(search_db.Conn(), "page_db", core_db.Url()); + String sql = String_.Format(Search_sql, link_tbl.Tbl_name(), link_tbl.Fld_page_id(), link_tbl.Fld_word_id(), word.Id(), "page_len", "DESC", limit, offset); + int total_read = 0; + Db_rdr rdr = attach_rdr.Exec_as_rdr(sql); + try { + Xowd_page_tbl page_tbl = core_db.Tbl__page(); + Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); + while (rdr.Move_next()) { + if (cmd.Canceled()) break; + ++total_read; + word.Rslts_offset_add_1(); + int page_ns = rdr.Read_int(page_tbl.Fld_page_ns()); + if (!qry.Ns_mgr().Has(page_ns)) continue; + byte[] page_ttl = rdr.Read_bry_by_str(page_tbl.Fld_page_title()); + byte[] page_ttl_lc = wiki.Lang().Case_mgr().Case_build_lower(Xoa_ttl.Replace_unders(page_ttl)); + byte[][] page_ttl_words = Bry_.Split(page_ttl_lc, Byte_ascii.Space, Bool_.Y); + if (!matcher.Matches(page_ttl_lc, page_ttl_words)) continue;// ttl doesn't match matcher; ignore; + int page_id = rdr.Read_int(page_tbl.Fld_page_id()); + int page_len = rdr.Read_int(page_tbl.Fld_page_len()); + 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; // page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" + Xows_db_row row = new Xows_db_row(wiki.Domain_bry(), page_id, page_ns, page_len, page_ttl_w_ns, page_ttl); + cmd.Add_rslt(row); + ++total_found; + } + } finally {rdr.Rls(); attach_rdr.Rls();} + if (total_read == 0) word.Rslts_done_y_(); + return total_read; + } + private static final String Search_sql = String_.Concat_lines_nl_skip_last + ( "SELECT cp.page_id" + , ", cp.page_namespace" + , ", cp.page_title" + , ", cp.page_len" + , "FROM {0} sp" + , " JOIN page cp ON cp.page_id = sp.{1} " + , "WHERE sp.{2} = {3}" + , "ORDER BY {4} {5}" + , "LIMIT {6}" + , "OFFSET {7};" + ); +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_db_word.java b/400_xowa/src/gplx/xowa/specials/search/Xows_db_word.java new file mode 100644 index 000000000..f55902720 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_db_word.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +public class Xows_db_word { + public Xows_db_word(int id, byte[] text, int page_count) {this.id = id; this.text = text; this.page_count = page_count;} + public int Id() {return id;} private final int id; + public byte[] Text() {return text;} private final byte[] text; + public int Page_count() {return page_count;} private 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 Xows_db_word_sorter implements gplx.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xows_db_word lhs = (Xows_db_word)lhsObj; + Xows_db_word rhs = (Xows_db_word)rhsObj; + return -Int_.Compare(lhs.Page_count(), rhs.Page_count()); + } + public static final Xows_db_word_sorter Page_count_dsc = new Xows_db_word_sorter(); Xows_db_word_sorter() {} +} 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 new file mode 100644 index 000000000..eb1774c51 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.html.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.langs.numbers.*; +class Xows_html_wkr { + private final Bry_bfr bfr = Bry_bfr.new_(255); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private Xows_ui_qry qry; private Xoh_lnki_wtr_utl lnki_wtr_utl; private Xol_num_mgr num_mgr; + public Xows_html_row Html_rows() {return html_rows;} private final Xows_html_row html_rows = new Xows_html_row(); + public void Init_by_wiki(Xoh_lnki_wtr_utl lnki_wtr_utl, Xol_num_mgr num_mgr) { + this.lnki_wtr_utl = lnki_wtr_utl; this.num_mgr = num_mgr; + html_rows.Ctor(lnki_wtr_utl); + } + @gplx.Internal protected void Qry_(Xows_ui_qry qry) {this.qry = qry;} // TEST: + public byte[] Gen_page(Xows_ui_qry qry, byte[] tbls) { + synchronized (bfr) { + this.qry = qry; + byte[] rslts_hdr = fmtr_rslts.Bld_bry_many(tmp_bfr, num_mgr.Format_num(qry.Itms_bgn() + ListAdp_.Base1), num_mgr.Format_num(qry.Itms_end()), qry.Search_raw()); + fmtr_page.Bld_bfr_many(bfr, rslts_hdr, Paging_link(Bool_.N), Paging_link(Bool_.Y), tbls); + return bfr.Xto_bry_and_clear(); + } + } + public void Gen_tbl(Bry_bfr bfr, Xows_ui_qry qry, Xows_ui_rslt rslt, byte[] cmd_key, byte[] wiki_domain, boolean searching_db) { + synchronized (bfr) { + this.qry = qry; + html_rows.Init(rslt); + fmtr_tbl.Bld_bfr_many(bfr, wiki_domain, searching_db ? Cancel_link(wiki_domain, cmd_key) : Bry_fmtr_arg_.Noop, Bry_hdr_len, Bry_hdr_ttl, Xows_ui_async.Gen_insert_key(wiki_domain), html_rows); + } + } + private Bry_fmtr_arg Cancel_link(byte[] domain, byte[] cmd_key) { + byte[] ttl_bry = tmp_bfr.Add_str_ascii("Special:Search/").Add(qry.Search_raw()).Add_str_ascii("?fulltext=y&xowa_page_index=").Add_int_variable(qry.Page_idx()).Add_str("&cancel=").Add(Html_utl.Encode_id_as_bry(cmd_key)).Xto_bry_and_clear(); + byte[] href = lnki_wtr_utl.Bld_href(ttl_bry); + byte[] title = lnki_wtr_utl.Bld_title(Bry_cancel); + return fmtr_paging_cxl.Vals_("xowa_cancel_" + String_.new_utf8_(domain), href, title, Bry_cancel); + } + public Bry_fmtr_arg Paging_link(boolean fwd) { + int paging_idx = qry.Page_idx(); + byte[] a_text = null; + Bry_fmtr_vals rv = null; + if (fwd) { + ++paging_idx; + a_text = Bry_paging_fwd; + if (paging_idx > qry.Page_max()) return Bry_fmtr_arg_.bry_(a_text); + rv = fmtr_paging_fwd; + } + else { + --paging_idx; + a_text = Bry_paging_bwd; + if (paging_idx < 0) return Bry_fmtr_arg_.bry_(a_text); + rv = fmtr_paging_bwd; + } + byte[] a_ttl_bry = tmp_bfr.Add_str_ascii("Special:Search/").Add(qry.Search_raw()).Add_str_ascii("?fulltext=y&xowa_page_index=").Add_int_variable(paging_idx).Xto_bry_and_clear(); + byte[] a_href = lnki_wtr_utl.Bld_href(a_ttl_bry); + byte[] a_title = lnki_wtr_utl.Bld_title(a_text); + return rv.Vals_(a_href, a_title, a_text); + } + private static final Bry_fmtr fmtr_page = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "~{rslts_hdr}" + , "
~{bwd_a}~{fwd_a}
~{tbls}" + , "
~{bwd_a}~{fwd_a}
" + ), "rslts_hdr", "bwd_a", "fwd_a", "tbls"); + // + private static final Bry_fmtr fmtr_tbl = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " ~{rows}" + , " " + , " " + , "
Help" + , "
~{wiki}~{cancel}" + , "
~{hdr_len}" + , " ~{hdr_ttl}" + , "
" + ), "wiki", "cancel", "hdr_len", "hdr_ttl", "insert_key", "rows"); + private static final Bry_fmtr fmtr_link = Bry_fmtr.new_("~{a_text}", "a_href", "a_title", "a_text"); + private static final Bry_fmtr fmtr_link_id = Bry_fmtr.new_("~{a_text}", "a_id", "a_href", "a_title", "a_text"); + private static final Bry_fmtr_vals fmtr_paging_bwd = Bry_fmtr_vals.new_(fmtr_link); + private static final Bry_fmtr_vals fmtr_paging_fwd = Bry_fmtr_vals.new_(fmtr_link); + private static final Bry_fmtr_vals fmtr_paging_cxl = Bry_fmtr_vals.new_(fmtr_link_id); + 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_ascii_("Next"), Bry_paging_bwd = Bry_.new_ascii_("Previous"), Bry_cancel = Bry_.new_ascii_("Stop searching") + , Bry_hdr_len = Bry_.new_ascii_("Page length"), Bry_hdr_ttl = Bry_.new_ascii_("Page title") + ; +} +class Xows_html_row implements Bry_fmtr_arg { + private Xows_ui_rslt rslt; private Xoh_lnki_wtr_utl lnki_wtr_utl; + public Xows_html_row Ctor(Xoh_lnki_wtr_utl lnki_wtr_utl) {this.lnki_wtr_utl = lnki_wtr_utl; return this;} + public Xows_html_row Init(Xows_ui_rslt rslt) {this.rslt = rslt; return this;} + public void XferAry(Bry_bfr bfr, int idx) { // A + int len = rslt.Len(); + for (int i = 0; i < len; ++i) { + Xows_db_row row = rslt.Get_at(i); + Gen_html(bfr, row); + } + } + public void Gen_html(Bry_bfr bfr, Xows_db_row row) { + byte[] href = lnki_wtr_utl.Bld_href(row.Page_ttl_w_ns()); + byte[] title = lnki_wtr_utl.Bld_title(row.Page_ttl_w_ns()); + fmtr.Bld_bfr_many(bfr, Html_utl.Encode_id_as_str(row.Key()), row.Page_len(), href, title, Xoa_ttl.Replace_unders(row.Page_ttl_w_ns())); + } + public Bry_fmtr Fmtr() {return fmtr;} private final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " ~{page_len}" + , " " + , " ~{a_text}" + , " " + , " " + ), "page_key", "page_len", "a_href", "a_title", "a_text"); +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java new file mode 100644 index 000000000..6e50423fe --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_html_wkr_tst.java @@ -0,0 +1,79 @@ +/* +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.tdbs.*; 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(); + @Test public void Paging() { + fxt.Test_paging(Bool_.Y, 1, "Next"); + fxt.Test_paging(Bool_.N, 1, "Previous"); + fxt.Test_paging(Bool_.Y, 2, "Next"); + fxt.Test_paging(Bool_.N, 0, "Previous"); + } + @Test public void Rows() { + fxt.Test_rows(Xows_db_row.Ary(fxt.Make_row(10, "A"), fxt.Make_row(20, "B")), String_.Concat_lines_nl_skip_last + ( "" + , " " + , " 10" + , " " + , " A" + , " " + , " " + , " " + , " 20" + , " " + , " B" + , " " + , " " + )); + } +} +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() { + if (app == null) { + app = Xoa_app_fxt.app_(); + wiki = Xoa_app_fxt.wiki_tst_(app); + html_mgr = new Xows_html_wkr(); + } + return this; + } + public void Test_paging(boolean fwd, int paging_idx, String expd) { + Xows_ui_qry qry = new Xows_ui_qry(Bry_.new_ascii_("A"), paging_idx, 100, Xosrh_rslt_itm_sorter.Tid_len_dsc, new Xows_ns_mgr(), true, Bry_.Ary(wiki.Domain_bry())); + qry.Page_max_(2); + html_mgr.Init_by_wiki(wiki.Html_mgr__lnki_wtr_utl(), wiki.Lang().Num_mgr()); + html_mgr.Qry_(qry); + Bry_fmtr_arg fmtr_arg = html_mgr.Paging_link(fwd); + fmtr_arg.XferAry(tmp_bfr, 0); + Tfds.Eq(expd, tmp_bfr.Xto_str_and_clear()); + } + public void Test_rows(Xows_db_row[] rows, String expd) { + Xows_ui_rslt rslt = new Xows_ui_rslt(); + Xows_html_row html_row = html_mgr.Html_rows(); + html_row.Ctor(wiki.Html_mgr__lnki_wtr_utl()); + html_row.Init(rslt); + for (int i = 0; i < rows.length; ++i) + rslt.Add(rows[i]); + html_row.XferAry(tmp_bfr, 0); + Tfds.Eq_str_lines(expd, tmp_bfr.Xto_str_and_clear()); + } + public Xows_db_row Make_row(int len, String ttl_str) { + byte[] ttl_bry = Bry_.new_utf8_(ttl_str); + return new Xows_db_row(Bry_.new_ascii_("w"), 1, Xow_ns_.Id_main, len, ttl_bry, ttl_bry); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java similarity index 88% rename from 400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java rename to 400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java index 8c7f2656b..0a842e41c 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ns_mgr.java @@ -17,11 +17,9 @@ 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.*; -public class Xosrh_ns_mgr { - private OrderedHash ns_hash = OrderedHash_.new_(); +public class Xows_ns_mgr { + private final OrderedHash ns_hash = OrderedHash_.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; - private Int_obj_ref tmp_ns_id = Int_obj_ref.neg1_(); - private Bry_bfr tmp_bfr = Bry_bfr.reset_(32); public void Clear() { ns_hash.Clear(); ns_all = ns_main = false; @@ -64,7 +62,7 @@ public class Xosrh_ns_mgr { if (ns_hash.Count() == 0) ns_main = true; } - public byte[] Xto_hash_key() { + public byte[] To_hash_key() { if (ns_all) return Hash_key_all; else if (ns_main) @@ -72,7 +70,7 @@ public class Xosrh_ns_mgr { else { int ns_hash_len = ns_hash.Count(); for (int i = 0; i < ns_hash_len; i++) { - if (i != 0) tmp_bfr.Add_byte_pipe(); + if (i != 0) tmp_bfr.Add_byte_semic(); Int_obj_ref ns_id_ref = (Int_obj_ref)ns_hash.FetchAt(i); tmp_bfr.Add_int_variable(ns_id_ref.Val()); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java new file mode 100644 index 000000000..321cccb91 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java @@ -0,0 +1,75 @@ +/* +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.*; import gplx.xowa.apis.xowa.specials.*; +public class Xows_page__search implements Xows_page { + private final Xows_core search_mgr; private final Xows_arg_mgr args_mgr = new Xows_arg_mgr(); + public Xows_page__search(Xowe_wiki wiki) { + this.search_mgr = new Xows_core(wiki.Appe().Wiki_mgr()); + } + 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 + // 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.Args()); + 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); + } + if ( search_suggest_mgr.Auto_wildcard() // add * automatically if option set + && wiki.Db_mgr().Tid() == gplx.xowa.dbs.Xodb_mgr_sql.Tid_sql // only apply to sql + && Bry_finder.Find_fwd(search_bry, Byte_ascii.Asterisk) == -1 // search term does not have asterisk + ) + search_bry = Bry_.Add(search_bry, Byte_ascii.Asterisk); + url.Page_bry_(Bry_.Add(Bry_.new_ascii_("Special:Search/"), search_bry));// HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 + // search wiki + Xoa_ttl search_ttl = Xoa_ttl.parse_(wiki, search_bry); + Xoae_page search_page = page; + if (!Bry_.Eq(search_bry, Bry_special_name)) // 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:Searc?search=Earth -> en.w:Earth; needed for search suggest + // page not found, or explicit_search invoked + if (search_page.Missing() || url.Search_fulltext()) { + if (args_mgr.Cancel() != null) { + search_mgr.Cancel(args_mgr.Cancel()); + page.Tab_data().Cancel_show_y_(); + return; + } + page.Html_data().Html_restricted_n_(); + page.Html_data().Xtn_search_text_(search_bry); + Xoapi_search search_api = wiki.Appe().Api_root().Special().Search(); + Xows_ui_qry qry = new Xows_ui_qry(search_bry, args_mgr.Paging_idx(), search_api.Results_per_page(), args_mgr.Sort_tid(), args_mgr.Ns_mgr(), search_api.Async_db(), Bry_.Ary(wiki.Domain_bry())); + search_mgr.Search(wiki, page, qry); + } + // page found; return it; + else { + wiki.ParsePage(search_page, true); + 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); + } + } + 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[] Bry_special_name = Bry_.new_ascii_("Special:Search"); +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async.java new file mode 100644 index 000000000..b9c242a4e --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.html.*; import gplx.xowa.files.gui.*; +class Xows_ui_async { + private final Xows_html_row html_row; private final Xog_js_wkr js_wkr; + private final Xows_db_row[] rows; private final int rows_len; + private final Bry_bfr bfr = Bry_bfr.new_(255); + private final byte[] insert_new_key; + private final Cancelable cxl; + public Xows_ui_async(Cancelable cxl, Xows_html_row html_row, Xog_js_wkr js_wkr, int paging_len, byte[] wiki) { + this.cxl = cxl; + this.html_row = html_row; this.js_wkr = js_wkr; + this.rows = new Xows_db_row[paging_len]; + this.rows_len = paging_len; + this.insert_new_key = Gen_insert_key(wiki); + } + public void Add(Xows_db_row new_row) { + Xows_db_row last_row = rows[rows_len - 1]; + if (last_row != null) { + if (Compare(new_row, last_row) == CompareAble_.MoreOrSame) return; // new_row is < last_row; exit + } + int new_row_slot = Find_insert_slot(new_row); if (new_row_slot == -1) return; + Xows_db_row insert_row = rows[new_row_slot]; + byte[] insert_key = insert_row == null ? insert_new_key : insert_row.Key(); + Displace(new_row_slot, new_row); + html_row.Gen_html(bfr, new_row); + String html_tbl = bfr.Xto_str_and_clear(); + synchronized (cxl) { + if (cxl.Canceled()) return; + } + js_wkr.Html_elem_append_above(Html_utl.Encode_id_as_str(insert_key), html_tbl); + if (last_row != null) { + synchronized (cxl) { + if (cxl.Canceled()) return; + } + js_wkr.Html_elem_replace_html(Html_utl.Encode_id_as_str(last_row.Key()), ""); + } + } + private int Find_insert_slot(Xows_db_row new_row) { + for (int i = 0; i < rows_len; ++i) { + Xows_db_row cur_row = rows[i]; + if (cur_row == null) return i; + if (Compare(new_row, cur_row) == CompareAble_.Less) return i; + } + return -1; + } + private void Displace(int new_row_slot, Xows_db_row new_row) { + for (int i = rows_len - 2; i >= new_row_slot; --i) { + rows[i + 1] = rows[i]; + } + rows[new_row_slot] = new_row; + } + private int Compare(Xows_db_row lhs, Xows_db_row rhs) { + return -Int_.Compare(lhs.Page_len(), rhs.Page_len()); + } + public static byte[] Gen_insert_key(byte[] wiki) {return Bry_.Add(Bry_insert_key, wiki);} + private static final byte[] Bry_insert_key = Bry_.new_ascii_("xowa_insert_"); +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java new file mode 100644 index 000000000..82b7d7681 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import org.junit.*; import gplx.xowa.files.gui.*; +public class Xows_ui_async_tst { + @Before public void init() {fxt.Clear();} private Xows_ui_async_fxt fxt = new Xows_ui_async_fxt(); + @Test public void Basic() { + fxt.Test_add(fxt.Make_rslt(50, "L"), fxt.Make_args_append("xowa_insert_w" , "w.7CL")); // insert new + fxt.Test_add(fxt.Make_rslt(30, "N"), fxt.Make_args_append("xowa_insert_w" , "w.7CN")); // insert below last + fxt.Test_add(fxt.Make_rslt(70, "J"), fxt.Make_args_append("w.7CL" , "w.7CJ")); // insert above first + fxt.Test_add(fxt.Make_rslt(60, "K"), fxt.Make_args_append("w.7CL" , "w.7CK")); // insert above mid + fxt.Test_add(fxt.Make_rslt(40, "M"), fxt.Make_args_append("w.7CN" , "w.7CM")); // insert below mid + fxt.Test_add(fxt.Make_rslt(10, "P")); // insert noop + fxt.Test_add(fxt.Make_rslt(80, "I"), fxt.Make_args_append("w.7CJ" , "w.7CI") , fxt.Make_args_replace("w.7CN")); // insert displace all + fxt.Test_add(fxt.Make_rslt(61, "K1"), fxt.Make_args_append("w.7CK" , "w.7CK1"), fxt.Make_args_replace("w.7CM")); // insert displace mid + } +} +class Xows_ui_async_fxt { + private Xows_html_row html_row; private static final byte[] Bry_enwiki = Bry_.new_ascii_("w"); + private Xows_ui_async async; + private Xog_js_wkr__log js_wkr = new Xog_js_wkr__log(); + public void Clear() { + Xoae_app app = Xoa_app_fxt.app_(); + Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "w"); + html_row = new Xows_html_row(); html_row.Ctor(wiki.Html_mgr__lnki_wtr_utl()); + html_row.Fmtr().Fmt_("~{page_key}"); + async = new Xows_ui_async(Cancelable_.Never, html_row, js_wkr, 5, Bry_enwiki); + } + public Xows_db_row Make_rslt(int len, String ttl) { + byte[] ttl_bry = Bry_.new_ascii_(ttl); + return new Xows_db_row(Bry_enwiki, 1, Xow_ns_.Id_main, len, ttl_bry, ttl_bry); + } + public Object[] Make_args_append(String uid, String html) {return Object_.Ary(Xog_js_wkr__log.Proc_append_above, uid, html);} + public Object[] Make_args_replace(String uid) {return Object_.Ary(Xog_js_wkr__log.Proc_replace_html, uid, "");} + public void Test_add(Xows_db_row row, Object[]... expd) { + async.Add(row); + int expd_len = expd.length; + Tfds.Eq(expd_len, js_wkr.Log__len()); + for (int i = 0; i < expd_len; ++i) { + String expd_str = String_.ConcatWith_any("\n", expd[i]); + String actl_str = String_.ConcatWith_any("\n", js_wkr.Log__get_at(i)); + Tfds.Eq_str_lines(expd_str, actl_str); + } + js_wkr.Log__clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.java new file mode 100644 index 000000000..eaf11e10e --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_cmd.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.threads.*; import gplx.xowa.wikis.*; import gplx.xowa.files.gui.*; import gplx.xowa.gui.views.*; +class Xows_ui_cmd implements GfoInvkAble, Cancelable, Xog_tab_close_lnr { + private final Xows_core mgr; + private final Xows_ui_qry qry; private final Xows_ui_rslt rslt; private final Xowe_wiki wiki; private final Xog_tab_close_mgr tab_close_mgr; + private final boolean async; private Xows_ui_async async_wkr; private final Xog_js_wkr js_wkr; + private Xows_db_cache cache; + public Xows_ui_cmd(Xows_core mgr, Xows_ui_qry qry, Xowe_wiki wiki, Xog_tab_close_mgr tab_close_mgr, Xog_js_wkr js_wkr) { + this.mgr = mgr; this.qry = qry; this.wiki = wiki; this.tab_close_mgr = tab_close_mgr; this.js_wkr = js_wkr; + this.async = Xoa_app_.Mode_is_gui() && qry.Async_db(); + this.rslt = new Xows_ui_rslt(); + this.key = gplx.html.Html_utl.Encode_id_as_bry(Bry_.Add_w_dlm(Byte_ascii.Pipe, qry.Key(), wiki.Domain_bry())); + } + public byte[] Key_for_html() {return key;} private byte[] key; + public String Wiki_domain_str() {return wiki.Domain_str();} + public byte[] Wiki_domain_bry() {return wiki.Domain_bry();} + public Xows_ui_rslt Rslt() {return rslt;} + public boolean Canceled() {synchronized (this) {return canceled;}} private boolean canceled; + public void Cancel() { + Xoa_app_.Usr_dlg().Prog_many("", "", "search canceled: key=~{0}", key); + synchronized (this) { + canceled = true; + } + } + public void Cancel_reset() {} + public void Search_db() { + tab_close_mgr.Add(this); + mgr.Db().Search(this, qry, rslt, cache, wiki); + mgr.Search_end(this); + synchronized (this) { + if (canceled) return; // NOTE: must check else throws SWT exception + } + js_wkr.Html_atr_set("xowa_cancel_" + wiki.Domain_str(), "style", "display:none;"); + Xoa_app_.Usr_dlg().Prog_many("", "", ""); + } + public boolean Search() { + this.cache = mgr.Get_cache_or_new(key); + boolean rv = false; + if (qry.Itms_end() > cache.Count() && !cache.Done()) { + if (async) + ThreadAdp_.invk_(this, Invk_search_db).Start(); + else + Search_db(); + rv = true; + } + cache.Get_between(rslt, qry.Itms_bgn(), qry.Itms_end()); + return rv; + } + public boolean When_close(Xog_tab_itm tab) { + this.Cancel(); + return true; + } + public void Add_rslt(Xows_db_row rslt) { + cache.Add(rslt); + if (async) { + if (async_wkr == null) + async_wkr = new Xows_ui_async(this, mgr.Html_wkr().Html_rows(), js_wkr, qry.Page_len(), wiki.Domain_bry()); + synchronized (this) { + if (canceled) return; + } + async_wkr.Add(rslt); + } + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_search_db)) Search_db(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } public static final String Invk_search_db = "search_db"; +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.java new file mode 100644 index 000000000..e8636a26e --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_qry.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +class Xows_ui_qry { + private final ListAdp cmd_list = ListAdp_.new_(); + public Xows_ui_qry(byte[] search_raw, int page_idx, int page_len, byte sort_tid, Xows_ns_mgr ns_mgr, boolean async_db, byte[][] wiki_domains) { + this.search_raw = search_raw; this.page_idx = page_idx; this.page_len = page_len; this.sort_tid = sort_tid; this.ns_mgr = ns_mgr; this.async_db = async_db; this.wiki_domains = wiki_domains; + this.itms_bgn = page_idx * 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()); + } + public byte[] Key() {return key;} private final byte[] key; + public byte[] Search_raw() {return search_raw;} private final byte[] search_raw; + public boolean Async_db() {return async_db;} private boolean async_db; + public int Page_idx() {return page_idx;} private final int page_idx; + public int Page_max() {return page_max;} private int page_max; + public int Page_len() {return page_len;} private final int page_len; + public int Itms_bgn() {return itms_bgn;} private final int itms_bgn; + public int Itms_end() {return itms_bgn + page_len;} + public byte Sort_tid() {return sort_tid;} private final byte sort_tid; + public Xows_ns_mgr Ns_mgr() {return ns_mgr;} private final Xows_ns_mgr ns_mgr; + public byte[][] Wiki_domains() {return wiki_domains;} private byte[][] wiki_domains; + public void Page_max_(int v) {this.page_max = v;} + public int Cmds__len() {return cmd_list.Count();} + public Xows_ui_cmd Cmds__get_at(int i) {return (Xows_ui_cmd)cmd_list.FetchAt(i);} + public void Cmds__add(Xows_ui_cmd cmd) {cmd_list.Add(cmd);} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_rslt.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_rslt.java new file mode 100644 index 000000000..5863ccee6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_rslt.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.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +class Xows_ui_rslt { + private final ListAdp rslt_list = ListAdp_.new_(); + public int Len() {return rslt_list.Count();} + public void Add(Xows_db_row rslt) {rslt_list.Add(rslt);} + public Xows_db_row Get_at(int i) {return (Xows_db_row)rslt_list.FetchAt(i);} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java index 66172e267..cd2a142d3 100644 --- a/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java @@ -18,65 +18,65 @@ 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.*; public class Xow_search_parser { private Xow_search_parser_ctx parse_ctx = new Xow_search_parser_ctx(); private byte[] src; - public Xow_search_matcher Parse(byte[] src) { + public Xows_db_matcher Parse(byte[] src) { this.src = src; Xow_search_tkn[] tkns = Xow_search_scanner.I.Scan(src); return Parse_itm_or(parse_ctx.Init(tkns)); } - private Xow_search_matcher Parse_itm_or(Xow_search_parser_ctx parse_ctx) { - Xow_search_matcher lhs = Parse_itm_and(parse_ctx); + private Xows_db_matcher Parse_itm_or(Xow_search_parser_ctx parse_ctx) { + Xows_db_matcher lhs = Parse_itm_and(parse_ctx); while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_or)) { parse_ctx.Move_next(); - Xow_search_matcher rhs = Parse_itm_and(parse_ctx); - lhs = new_join(Xow_search_matcher.Tid_or, lhs, rhs); + Xows_db_matcher rhs = Parse_itm_and(parse_ctx); + lhs = new_join(Xows_db_matcher.Tid_or, lhs, rhs); } return lhs; } - private Xow_search_matcher Parse_itm_and(Xow_search_parser_ctx parse_ctx) { - Xow_search_matcher lhs = Parse_itm_not(parse_ctx); + private Xows_db_matcher Parse_itm_and(Xow_search_parser_ctx parse_ctx) { + Xows_db_matcher lhs = Parse_itm_not(parse_ctx); while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_and)) { parse_ctx.Move_next(); - Xow_search_matcher rhs = Parse_itm_not(parse_ctx); - lhs = new_join(Xow_search_matcher.Tid_and, lhs, rhs); + Xows_db_matcher rhs = Parse_itm_not(parse_ctx); + lhs = new_join(Xows_db_matcher.Tid_and, lhs, rhs); } return lhs; } - private Xow_search_matcher Parse_itm_not(Xow_search_parser_ctx parse_ctx) { - Xow_search_matcher lhs = Parse_itm_leaf(parse_ctx); + private Xows_db_matcher Parse_itm_not(Xow_search_parser_ctx parse_ctx) { + Xows_db_matcher lhs = Parse_itm_leaf(parse_ctx); while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_not)) { parse_ctx.Move_next(); - Xow_search_matcher rhs = Parse_itm_leaf(parse_ctx); - lhs = new_join(Xow_search_matcher.Tid_not, null, rhs); + Xows_db_matcher rhs = Parse_itm_leaf(parse_ctx); + lhs = new_join(Xows_db_matcher.Tid_not, null, rhs); } return lhs; } - private Xow_search_matcher Parse_itm_leaf(Xow_search_parser_ctx parse_ctx) { + private Xows_db_matcher Parse_itm_leaf(Xow_search_parser_ctx parse_ctx) { if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_bgn)) { parse_ctx.Move_next(); - Xow_search_matcher lhs = Parse_itm_or(parse_ctx); + Xows_db_matcher lhs = Parse_itm_or(parse_ctx); if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_end)) parse_ctx.Move_next(); // skip token return lhs; } else if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_eos)) - return Xow_search_matcher.Null; + return Xows_db_matcher.Null; else { Xow_search_tkn word_tkn = parse_ctx.Move_next(); if (word_tkn.Tid() == Xow_search_tkn.Tid_not) { word_tkn = parse_ctx.Move_next(); - if (word_tkn == null) return Xow_search_matcher.Null; // occurs in "a -" - Xow_search_matcher word_itm = new_word(word_tkn, src); - return new_join(Xow_search_matcher.Tid_not, null, word_itm); + if (word_tkn == null) return Xows_db_matcher.Null; // occurs in "a -" + Xows_db_matcher word_itm = new_word(word_tkn, src); + return new_join(Xows_db_matcher.Tid_not, null, word_itm); } else return new_word(word_tkn, src); } } - private static Xow_search_matcher new_word(Xow_search_tkn tkn, byte[] src) { - int tid = tkn.Tid() == Xow_search_tkn.Tid_word ? Xow_search_matcher.Tid_word : Xow_search_matcher.Tid_word_quote; - return new Xow_search_matcher(tid, tkn.Val(src), null, null); + private static Xows_db_matcher new_word(Xow_search_tkn tkn, byte[] src) { + int tid = tkn.Tid() == Xow_search_tkn.Tid_word ? Xows_db_matcher.Tid_word : Xows_db_matcher.Tid_word_quote; + return new Xows_db_matcher(tid, tkn.Val(src), null, null); } - private static Xow_search_matcher new_join(int tid, Xow_search_matcher lhs, Xow_search_matcher rhs) {return new Xow_search_matcher(tid, null, lhs, rhs);} - public static final Xow_search_parser _ = new Xow_search_parser(); Xow_search_parser() {} + private static Xows_db_matcher new_join(int tid, Xows_db_matcher lhs, Xows_db_matcher rhs) {return new Xows_db_matcher(tid, null, lhs, rhs);} + public static final Xow_search_parser I = new Xow_search_parser(); Xow_search_parser() {} } class Xow_search_parser_ctx { private Xow_search_tkn[] ary; private int pos = 0; private int ary_len; 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 8c8625f1c..fdb568fa4 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 @@ -21,7 +21,7 @@ public class Xop_statistics_page implements Xows_page { private Xop_statistics_stats_page_grp stats_page = new Xop_statistics_stats_page_grp(); // private Xop_statistics_stats_wiki_grp stats_wiki = new Xop_statistics_stats_wiki_grp(); private Xop_statistics_stats_ns_grp stats_ns = new Xop_statistics_stats_ns_grp(); - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { byte[] html = Build_html(wiki); page.Html_data().Html_restricted_n_(); // [[Special:]] pages allow all HTML page.Data_raw_(html); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/default_tab/Default_tab_page.java b/400_xowa/src/gplx/xowa/specials/xowa/default_tab/Default_tab_page.java index c8f5b2739..7de1d79e2 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/default_tab/Default_tab_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/default_tab/Default_tab_page.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.specials.xowa.default_tab; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; public class Default_tab_page implements Xows_page { - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { page.Data_raw_(Bry_.Empty); page.Html_data().Custom_html_(Bry_.Empty); page.Html_data().Custom_name_(Tab_name_bry); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java index 3d10d8e55..c8382a534 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java @@ -19,7 +19,7 @@ package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.* import gplx.xowa.specials.*; import gplx.ios.*; public class Xosp_fbrow_special implements Xows_page { private static final Xoa_url_arg_mgr url_args = new Xoa_url_arg_mgr(null); - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { Xosp_fbrow_rslt rslt = Gen(url.Args(), GfoInvkAble_.Null); page.Html_data().Html_restricted_n_(); page.Html_data().Custom_head_end_concat(rslt.Html_head()); 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 427aa860a..81b78b523 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 @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.specials.xowa.popup_history; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; import gplx.xowa.html.modules.popups.*; public class Popup_history_page implements Xows_page { - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { Xoae_page cur_page = wiki.Appe().Gui_mgr().Browser_win().Active_page(); if (cur_page == null) return; OrderedHash hash = cur_page.Popup_mgr().Itms(); int len = hash.Count(); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java index 18cddde86..decb421f0 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java @@ -19,7 +19,7 @@ package gplx.xowa.specials.xowa.system_data; import gplx.*; import gplx.xowa.*; import gplx.core.primitives.*; public class System_data_page implements Xows_page { private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); - public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { arg_hash.Load(url); byte[] file_type = arg_hash.Get_val_bry_or(Arg_type, null); if (file_type == null) return; Byte_obj_val type_val = (Byte_obj_val)type_hash.Get_by_bry(file_type); if (type_val == null) return; diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java index 70a1d394e..df230d38a 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java @@ -19,7 +19,7 @@ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.xowa.specials.*; public class Xoud_history_special implements Bry_fmtr_arg, Xows_page { private ListAdp rows = ListAdp_.new_(); - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { Xoae_app app = wiki.Appe(); Xoud_history_mgr mgr = app.User().Data_mgr().History_mgr(); mgr.Select(rows, 100); diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java index e834b91a7..4f0e0ba9d 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java @@ -37,7 +37,7 @@ public class Xou_history_html implements Bry_fmtr_arg, Xows_page { , " ~{itm_last}" , " " ), "itm_wiki", "itm_page", "itm_count", "itm_last"); - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { this.app = wiki.Appe(); this.mgr = app.User().History_mgr(); mgr.Sort(); Bry_bfr bfr = app.Utl__bfr_mkr().Get_m001(); diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java b/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java index 53c708904..9c2465656 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java @@ -25,8 +25,4 @@ public class Xow_cfg_consts { , Grp__bldr_fsdb = "xowa.bldr.fsdb" , Grp_wiki_init = "wiki.init" ; - public static final String - Key__schema__col_page_html_text_id = "col.page.page_html_text_id" - , Key__schema__tbl_css_core = "tbl.css_core" - ; } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java index 3fd380475..4309beda5 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java @@ -18,12 +18,12 @@ along with this program. If not, see . package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.infos.*; public class Xowd_db_file { - Xowd_db_file(Xob_info_session info_session, Xob_info_file info_file, Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid, Db_conn conn, byte cmd_mode) { + Xowd_db_file(Db_cfg_tbl cfg_tbl, Xob_info_session info_session, Xob_info_file info_file, Xowd_core_db_props props, Xowd_db_file_schema_props schema_props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid, Db_conn conn, byte cmd_mode) { this.id = id; this.tid = tid; this.url = url; this.ns_ids = ns_ids; this.part_id = part_id; this.guid = guid; this.conn = conn; this.cmd_mode = cmd_mode; this.url_rel = url.NameAndExt(); boolean schema_is_1 = props.Schema_is_1(); - this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg"); + this.tbl__cfg = cfg_tbl; this.tbl__db = new Xowd_xowa_db_tbl(conn, schema_is_1); this.tbl__ns = new Xowd_site_ns_tbl(conn, schema_is_1); this.tbl__site_stats = new Xowd_site_stats_tbl(conn, schema_is_1); @@ -36,10 +36,10 @@ public class Xowd_db_file { this.tbl__cat_link = new Xowd_cat_link_tbl(conn, schema_is_1); this.tbl__wbase_qid = new Xowd_wbase_qid_tbl(conn, schema_is_1); this.tbl__wbase_pid = new Xowd_wbase_pid_tbl(conn, schema_is_1); - this.tbl__search_word = new Xowd_search_word_tbl(conn, schema_is_1); + this.tbl__search_word = new Xowd_search_word_tbl(conn, schema_is_1, schema_props.Search__word__page_count_exists()); this.tbl__search_link = new Xowd_search_link_tbl(conn, schema_is_1); - this.info_session = info_session == null ? Xob_info_session.Load(tbl__cfg) : info_session; - this.info_file = info_file == null ? Xob_info_file.Load(tbl__cfg) : info_file; + this.info_session = info_session; + this.info_file = info_file; } public int Id() {return id;} private final int id; // unique id in xowa_db public byte Tid() {return tid;} private final byte tid; @@ -75,8 +75,9 @@ public class Xowd_db_file { public static Xowd_db_file make_(Xob_info_session info_session, Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, String core_file_name, Db_conn conn) { Guid_adp guid = Guid_adp_.random_(); Xob_info_file info_file = new Xob_info_file(id, Xowd_db_file_.To_key(tid), ns_ids, part_id, guid, props.Schema(), core_file_name, url.NameAndExt()); - Xowd_db_file rv = new Xowd_db_file(info_session, info_file, props, id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_create); - rv.Tbl__cfg().Create_tbl(); // always create cfg in each db + Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg"); + Xowd_db_file rv = new Xowd_db_file(cfg_tbl, info_session, info_file, props, Xowd_db_file_schema_props.make_(), id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_create); + cfg_tbl.Create_tbl(); // always create cfg in each db return rv; } public static Xowd_db_file load_(Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid) { @@ -85,6 +86,7 @@ public class Xowd_db_file { Xoa_app_.Usr_dlg().Warn_many("", "", "wiki.db:missing db; tid=~{0} url=~{1}", Xowd_db_file_.To_key(tid), url.Raw()); conn = Db_conn_.Empty; } - return new Xowd_db_file(null, null, props, id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_ignore); + Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg"); + return new Xowd_db_file(cfg_tbl, Xob_info_session.Load(cfg_tbl), Xob_info_file.Load(cfg_tbl), props, Xowd_db_file_schema_props.load_(cfg_tbl), id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_ignore); } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_schema_props.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_schema_props.java new file mode 100644 index 000000000..56e8f2b74 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_schema_props.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.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +import gplx.dbs.cfgs.*; +public class Xowd_db_file_schema_props { + Xowd_db_file_schema_props(boolean search__word__page_count_exists) { + this.search__word__page_count_exists = search__word__page_count_exists; + } + public boolean Search__word__page_count_exists() {return search__word__page_count_exists;} private final boolean search__word__page_count_exists; + public static Xowd_db_file_schema_props make_() {return new Xowd_db_file_schema_props(Bool_.Y);} + public static Xowd_db_file_schema_props load_(Db_cfg_tbl tbl) { + boolean search__word__page_count_exists = tbl.Select_yn_or(Grp, Key__col_search_word_page_count, Bool_.N); + return new Xowd_db_file_schema_props(search__word__page_count_exists); + } + public static final String Grp = Xow_cfg_consts.Grp__wiki_schema; + public static final String + Key__col_page_html_text_id = "col.page.page_html_text_id" + , Key__tbl_css_core = "tbl.css_core" // VERSION:2.4.1 + , Key__col_search_word_page_count = "col.search_word.word_page_count" // VERSION:2.4.2 + ; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java index d3ad7c691..399b0d317 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java @@ -86,7 +86,7 @@ public class Xowd_db_mgr { db__core.Tbl__cat_link().Create_tbl(); } Dbs__add_and_save(db__core); - db__core.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, Bool_.Y); + db__core.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__col_page_html_text_id, Bool_.Y); props.Cfg_save(db__core.Tbl__cfg()); // NOTE: must save cfg now, especially zip_tid; latter will be reloaded after import is done; conn.Txn_end(); } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java index 1f194f90e..4982dc2df 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java @@ -62,12 +62,13 @@ public class Xowd_html_tbl implements RlsAble { } public static void Assert_col__page_html_db_id(Xowd_db_mgr db_mgr) { Db_cfg_tbl cfg_tbl = db_mgr.Tbl__cfg(); - String exists = cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, "n"); + String exists = cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__col_page_html_text_id, "n"); if (String_.Eq(exists, "y")) return; Xowd_page_tbl pg_tbl = db_mgr.Tbl__page(); Db_conn conn = db_mgr.Db__core().Conn(); conn.Ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_html_db_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; // conn.Ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_page_redirect_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; - cfg_tbl.Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, Bool_.Y); + cfg_tbl.Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__col_page_html_text_id, Bool_.Y); + pg_tbl.Hdump_enabled_(Bool_.Y); } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java index 448b6e317..e041809aa 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java @@ -31,6 +31,9 @@ public class Xowd_search_link_tbl { fld_page_id = flds.Add_int(fld_prefix + "page_id"); in_wkr.Ctor(tbl_name, flds, fld_page_id, fld_word_id); } + public String Tbl_name() {return tbl_name;} + public String Fld_word_id() {return fld_word_id;} + public String Fld_page_id() {return fld_page_id;} public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx_unique() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} public void Create_idx_normal() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java index 5c41a00c6..5b452bc80 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java @@ -73,9 +73,10 @@ public class Xowd_search_temp_tbl { , ";" ); private static final String Sql_create_word_v2 = String_.Concat_lines_nl - ( "INSERT INTO search_word (word_id, word_text)" + ( "INSERT INTO search_word (word_id, word_text, word_page_count)" , "SELECT word_id" , ", word_text" + , ", Count(DISTINCT page_id)" , "FROM search_temp" , "GROUP BY " , " word_text" diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_row.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_row.java new file mode 100644 index 000000000..55cc55a0f --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_row.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.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +public class Xowd_search_word_row { + public Xowd_search_word_row(int id, byte[] text, int page_count) {this.id = id; this.text = text; this.page_count = page_count;} + public int Id() {return id;} private final int id; + public byte[] Text() {return text;} private final byte[] text; + public int Page_count() {return page_count;} private final int page_count; + public static final Xowd_search_word_row Null = null; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java index 8240a5fff..be0f9a8ab 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java @@ -16,33 +16,58 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; -import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.qrys.*; +import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.qrys.*; public class Xowd_search_word_tbl implements RlsAble { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private final String fld_id, fld_text; - private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_id; - public Xowd_search_word_tbl(Db_conn conn, boolean schema_is_1) { - this.conn = conn; + private final String fld_id, fld_text; private String fld_page_count; private boolean page_count_exists; + private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by, stmt_select_in; + public Xowd_search_word_tbl(Db_conn conn, boolean schema_is_1, boolean page_count_exists) { + this.conn = conn; this.page_count_exists = page_count_exists; 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";} - fld_id = flds.Add_int_pkey(fld_prefix + "word_id"); - fld_text = flds.Add_str(fld_text_name, 255); + this.fld_id = flds.Add_int_pkey(fld_prefix + "word_id"); + this.fld_text = flds.Add_str(fld_text_name, 255); + this.fld_page_count = page_count_exists ? flds.Add_int_dflt("word_page_count", 0) : Db_meta_fld.Key_null; conn.Rls_reg(this); } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} - public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_text, fld_id));} + public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_text, fld_id, fld_page_count));} public void Insert_bgn() {conn.Txn_bgn(); 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) { - stmt_insert.Clear().Val_int(fld_id, id).Val_bry_as_str(fld_text, word).Exec_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_page_count, page_count).Exec_insert(); } - public int Select_id(byte[] word) { - if (stmt_select_id == null) stmt_select_id = conn.Stmt_select(tbl_name, flds, fld_text); - Db_rdr rdr = stmt_select_id.Clear().Crt_bry(fld_text, word).Exec_select__rls_auto(); - try {return rdr.Move_next() ? rdr.Read_int(fld_id) : Id_null;} + public Xowd_search_word_row Select_by_or_null(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) : Xowd_search_word_row.Null; + } finally {rdr.Rls();} } + private Xowd_search_word_row new_row(Db_rdr rdr) { + int page_count = fld_page_count == Db_meta_fld.Key_null ? 0 : rdr.Read_int(fld_page_count); + return new Xowd_search_word_row(rdr.Read_int(fld_id), rdr.Read_bry_by_str(fld_text), page_count); + } + public Xowd_search_word_row[] Select_in(Cancelable cxl, byte[] word) { + if (stmt_select_in == null) { + Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).Where_(Db_crt_.like_(fld_text, "")); + stmt_select_in = conn.Stmt_new(qry); + } + ListAdp list = ListAdp_.new_(); + Db_rdr rdr = stmt_select_in.Clear().Crt_bry_as_str(fld_text, Bry_.Replace(word, Byte_ascii.Asterisk, Byte_ascii.Percent)).Exec_select__rls_manual(); + try { + while (rdr.Move_next()) { + synchronized (cxl) { + if (cxl.Canceled()) break; + } + list.Add(new_row(rdr)); + } + } + finally {rdr.Rls();} + return (Xowd_search_word_row[])list.Xto_ary_and_clear(Xowd_search_word_row.class); + } public void Select_by_word(Cancelable cancelable, Xowd_search_link_tbl search_page_tbl, ListAdp rv, byte[] search, int results_max) { gplx.core.criterias.Criteria crt = null; if (Bry_.Has(search, Byte_ascii.Asterisk)) { @@ -63,9 +88,40 @@ public class Xowd_search_word_tbl implements RlsAble { search_page_tbl.Select_in(cancelable, rv, words); } + public boolean Ddl__page_count() {return page_count_exists;} + public void Ddl__page_count_y_() { // needed for search_cmd; + page_count_exists = true; + if (!flds.Has("word_page_count")) + flds.Add_int_dflt("word_page_count", 0); + } + public void Ddl__page_count__add(Xowd_search_link_tbl link_tbl, Db_cfg_tbl cfg_tbl) { + Db_meta_fld page_count_fld = new Db_meta_fld("word_page_count", Db_meta_fld.Tid_int, Db_meta_fld.Len_null, Bool_.N, Bool_.N, Bool_.N, 0); + conn.Txn_bgn(); + conn.Ddl_append_fld(tbl_name, page_count_fld); // ALTER TABLE search_word ADD word_page_count integer NOT NULL DEFAULT 0; + String sql = String_.Format(String_.Concat_lines_nl_skip_last + ( "REPLACE INTO {0} ({1}, {2}, word_page_count)" + , "SELECT w.{1}" + , ", w.{2}" + , ", Count(l.{4})" + , "FROM {0} w" + , " JOIN {3} l ON w.{1} = l.{4}" + , "GROUP BY w.{1}" + , ", w.{2};" + ), tbl_name, fld_id, fld_text + , link_tbl.Tbl_name(), link_tbl.Fld_word_id() + ); + conn.Exec_sql_plog_ntx("calculating page count per word (please wait)", sql); + Ddl__page_count__cfg(cfg_tbl); + fld_page_count = page_count_fld.Name(); flds.Add_itm(page_count_fld); this.Rls(); + conn.Txn_end(); + } + public void Ddl__page_count__cfg(Db_cfg_tbl cfg_tbl) { + cfg_tbl.Insert_yn(Xowd_db_file_schema_props.Grp, Xowd_db_file_schema_props.Key__col_search_word_page_count, Bool_.Y); + } public void Rls() { - stmt_insert = Db_stmt_.Rls(stmt_insert); - stmt_select_id = Db_stmt_.Rls(stmt_select_id); + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select_by = Db_stmt_.Rls(stmt_select_by); + stmt_select_in = Db_stmt_.Rls(stmt_select_in); } public static final int Id_null = -1; } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java index 75fbbe8af..21bfc2080 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java @@ -225,6 +225,10 @@ class Func_tkn_e_op extends Func_tkn_base { DecimalAdp rhs = val_stack.Pop(); DecimalAdp lhs = val_stack.Pop(); int rhs_int = rhs.Xto_int(); + if (rhs_int > 308) { // PHP:"maximum of ~1.8e308"; verified with {{#expr:1.8e308}} on sandbox; REF:http://php.net/manual/en/language.types.float.php; PAGE:en.w:Factorial; en.w:Astatine; DATE:2015-04-08 + shunter.Rslt_set(Double_.Inf_pos_bry); + return false; + } double rhs_double = rhs.Xto_double(); if ((double)rhs_int == rhs_double) // exponent is integer; use pow_10 which does less casts to double val_stack.Push(lhs.Op_mult(DecimalAdp_.pow_10_(rhs_int))); diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_tst.java index 730e5a73d..8b48f14e0 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_tst.java @@ -59,6 +59,8 @@ public class Pfunc_expr_tst { @Test public void Pi_mult() {fxt.Test_parse_tmpl_str_test("{{#expr:pi*1}}" , "{{test}}" , "3.14159265358979");} @Test public void E_op_pos() {fxt.Test_parse_tmpl_str_test("{{#expr:1.2 e 2}}" , "{{test}}" , "120");} @Test public void E_op_neg() {fxt.Test_parse_tmpl_str_test("{{#expr:1.2 e -2}}" , "{{test}}" , "0.012");} + @Test public void E_op_inf() {fxt.Test_parse_tmpl_str_test("{{#expr:1.2 e 309}}" , "{{test}}" , "INF");} // PURPOSE:constrain decimal to PHP double (e308); PAGE:en.w:Factorial; en.w:Astatine; DATE:2015-04-09 + @Test public void E_op_large() {fxt.Test_parse_tmpl_str_test("{{#expr:1E28}}" , "{{test}}" , "1E+28");} // PURPOSE:number should print in exponent notation (1E307), not full literal String (10000000...); DATE:2015-04-09; @Test public void Ceil_neg() {fxt.Test_parse_tmpl_str_test("{{#expr:ceil(-1.2)}}" , "{{test}}" , "-1");} @Test public void Trunc_neg() {fxt.Test_parse_tmpl_str_test("{{#expr:trunc(-1.2)}}" , "{{test}}" , "-1");} @Test public void Floor_neg() {fxt.Test_parse_tmpl_str_test("{{#expr:floor(-1.2)}}" , "{{test}}" , "-2");} @@ -69,6 +71,7 @@ public class Pfunc_expr_tst { @Test public void Abs_neg() {fxt.Test_parse_tmpl_str_test("{{#expr:abs(-1)}}" , "{{test}}" , "1");} @Test public void Exp() {fxt.Test_parse_tmpl_str_test("{{#expr:exp(10)}}" , "{{test}}" , "22026.46579480671789");} // NOTE: MW returns 4807, not 480671789; @Test public void Ln() {fxt.Test_parse_tmpl_str_test("{{#expr:ln(22026.4657948067)}}" , "{{test}}" , "10");} + @Test public void Ln_mult() {fxt.Test_parse_tmpl_str_test("{{#expr:ln4/ln2}}" , "{{test}}" , "2");} // PAGE:en.w:Fieldbus; DATE:2015-04-09 @Test public void Sin() {fxt.Test_parse_tmpl_str_test("{{#expr:sin(1.5707963267949)}}" , "{{test}}" , "1");} @Test public void Cos() {fxt.Test_parse_tmpl_str_test("{{#expr:cos(0)}}" , "{{test}}" , "1");} @Test public void Tan() {fxt.Test_parse_tmpl_str_test("{{#expr:tan(45)}}" , "{{test}}" , "1.61977519054386");} diff --git a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java index 71205561c..8085712d5 100644 --- a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java @@ -158,7 +158,7 @@ public class Score_xnde implements Xox_xnde, Xop_xnde_atr_parser, Xoh_cmd_itm { fail_msg = null; } private String fail_msg = null; public void Hcmd_write(Xoae_app app, Gfo_usr_dlg usr_dlg, Xoae_page page) { - Xog_html_itm html_itm = page.Tab().Html_itm(); + Xog_html_itm html_itm = page.Tab_data().Tab().Html_itm(); if (fail_msg == null) { // fill in png/midi; html_itm.Html_atr_set(html_id_a, "href", html_a_href); html_itm.Html_atr_set(html_id_img, "src", html_img_src); diff --git a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page.java b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page.java index b5e28aab8..d1017837a 100644 --- a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page.java +++ b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.translates; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.specials.*; public class Xop_mylanguage_page implements Xows_page { - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { // Special:MyLanguage/Help:A -> Help:A/fr byte[] page_bry = ttl.Leaf_txt_wo_qarg(); // EX: Help:A byte[] lang_key = wiki.Appe().User().Lang().Key_bry(); // EX: fr diff --git a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java index 65690e445..a2cdc3f9a 100644 --- a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java @@ -51,7 +51,7 @@ class Xop_mylanguage_page_fxt { page.Url_(url); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_ascii_(link)); page.Ttl_(ttl); - special_page.Special_gen(url, page, wiki, ttl); + special_page.Special_gen(wiki, page, url, ttl); Tfds.Eq(expd, String_.new_ascii_(page.Url().Page_bry())); Tfds.Eq(expd, String_.new_ascii_(page.Data_raw())); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__claim.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__claim.java index 65c4461e4..46d8ec113 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__claim.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__claim.java @@ -41,10 +41,8 @@ class Wdata_fmtr__claim_grp implements Bry_fmtr_arg { ( "" , "

~{hdr_text}~{toggle_btn}

" , "
" - , "
" - , "
" - , "
~{tbls}" - , "
" + , "
" + , "
~{tbls}" , "
" , "
" , "
" @@ -74,15 +72,13 @@ class Wdata_fmtr__claim_tbl implements Bry_fmtr_arg { } private Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
" - , "
~{itms}" + , "
" + , "
" + , "
" + , " P~{pid} - ~{pid_lbl}" + , "
" + , "
~{itms}" , "
" - , "
" - , "
" - , " P~{pid} - ~{pid_lbl}" - , "
" - , "
" - , "
" ), "pid", "pid_lbl", "itms"); } class Wdata_fmtr__claim_row implements Bry_fmtr_arg { @@ -119,7 +115,9 @@ class Wdata_fmtr__claim_row implements Bry_fmtr_arg { } private Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
" + , "
" + , "
" + , "
" , "
" , "
" , " " @@ -127,19 +125,21 @@ class Wdata_fmtr__claim_row implements Bry_fmtr_arg { , "
" , "
" // omit -Q2$e8ba1188-4aec-9e37-a75e-f79466c1913e , "
" - , "
" - , "
" - , "
" + , "
" + , "
" + , "
" , "
" - , "
" - , "
" - , "
~{value}" + , "
" + , "
" + , "
~{value}" , "
" , "
" , "
" , "
~{qualifiers}" , "
~{references}" , "
" + , "
" + , "
" ), "rank_name", "value", "qualifiers", "references" ); } @@ -160,7 +160,7 @@ class Wdata_fmtr__qual_tbl implements Bry_fmtr_arg { private Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" , "
" - , "
~{itms}" + , "
~{itms}" , "
" , "
" ), "itms"); @@ -188,17 +188,17 @@ class Wdata_fmtr__qual_row implements Bry_fmtr_arg { } private Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
" - , "
" - , "
" - , "
" - , "
" + , "
" + , "
" + , "
" + , "
" + , "
" , " ~{pid_lbl}" , "
" , "
" - , "
" - , "
" - , "
~{value}" + , "
" + , "
" + , "
~{value}" , "
" , "
" , "
" @@ -225,12 +225,12 @@ class Wdata_fmtr__ref_tbl implements Bry_fmtr_arg { ( "" // , "
1 reference
" , "
" - , "
" - , "
" // OMIT: wb-referenceview-8e7d51e38606193465d2a1e9d41ba490e06682a6 - , "
" - , "
" - , "
" - , "
~{itms}" + , "
" + , "
" // OMIT: wb-referenceview-8e7d51e38606193465d2a1e9d41ba490e06682a6 + , "
" + , "
" + , "
" + , "
~{itms}" , "
" , "
" , "
" @@ -268,15 +268,15 @@ class Wdata_fmtr__ref_row implements Bry_fmtr_arg { } private Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
" - , "
" - , "
" + , "
" + , "
" + , "
" , " ~{pid_lbl}" , "
" , "
" - , "
" - , "
" - , "
~{value}" + , "
" + , "
" + , "
~{value}" , "
" , "
" , "
" diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__oview.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__oview.java index 9a9f6863b..484607e3d 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__oview.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_fmtr__oview.java @@ -47,27 +47,19 @@ class Wdata_fmtr__oview_tbl implements Bry_fmtr_arg { } private Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "

" - , "
" - , "
" - , " ~{ttl_label}" - , " (~{ttl})" + , "
" + , "
" + , "

~{ttl_label}" + , " (~{ttl})" + , "

" + , "
~{ttl_descr}" + , "
" + , "
" + , "
    ~{ttl_aliases}" + , "
" + , "
" + , "
" , "
" - , "
" - , "

" - , "
" - , "
" - , " ~{ttl_descr}" - , "
" - , "
" - , "
" - , "
" - , "
" - , " ~{hdr_aliases}" - , "
    ~{ttl_aliases}" - , "
" - , "
" - , "
" ), "ttl", "ttl_label", "ttl_descr", "hdr_aliases", "ttl_aliases" ); private static byte[][] Alias_get_or_empty(OrderedHash list, byte[][] langs) { @@ -94,7 +86,7 @@ class Wdata_fmtr__oview_alias_itm implements Bry_fmtr_arg { } private Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
  • ~{itm}
  • " + , "
  • ~{itm}
  • " ), "itm" ); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java index 36c64e9b0..181282535 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java @@ -51,8 +51,8 @@ public class Wdata_visitor__html_wtr_tst { @Test public void Quantity_frac() { fxt .Test_claim_val - ( fxt.Wdata_fxt().Make_claim_quantity(1, "+0.12345", "units", "+0.12346", "+0.12344") - , "+0.12345 ±0.00001 units" + ( fxt.Wdata_fxt().Make_claim_quantity(1, "+0.1234", "units", "+0.1235", "+0.1233") + , "+0.1234 ±0.0001 units" ); } @Test public void Entity() { diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.java new file mode 100644 index 000000000..35eb713ce --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.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.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +import gplx.dbs.*; import gplx.xowa.bldrs.*; +public class Xob_site_ns_cmd implements Xob_cmd { + private final Xob_bldr bldr; + public Xob_site_ns_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.bldr = bldr;} + public String Cmd_key() {return Xob_cmd_keys.Key_wbase_ns;} + public void Cmd_run() { + Xow_wmf_api_mgr api_mgr = new Xow_wmf_api_mgr(); + Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(bldr.App().Fsys_mgr().Root_dir()); + Xowmf_site_tbl tbl_site = new Xowmf_site_tbl(conn); Xowmf_ns_tbl tbl_itm = new Xowmf_ns_tbl(conn); + Xow_wmf_api_wkr__ns api_wkr = new Xow_wmf_api_wkr__ns(tbl_site, tbl_itm); + api_mgr.Api_exec(api_wkr); + } + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_end() {} + public void Cmd_term() {} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;} +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java new file mode 100644 index 000000000..e6763b0b3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.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.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +import gplx.dbs.*; +import gplx.xowa.wikis.*; +class Xob_wbase_ns_parser { + private final Hash_adp_bry ns_mgr_hash = Hash_adp_bry.cs_(); + private final Xowmf_site_tbl tbl_site; private final Xowmf_ns_tbl tbl_itm; + public Xob_wbase_ns_parser(Db_conn conn) { + this.tbl_site = new Xowmf_site_tbl(conn); + this.tbl_itm = new Xowmf_ns_tbl(conn); + } + public void Find(Xob_wbase_ns_parser_rslt rv, byte[] wiki_abrv, byte[] ttl) { // enwiki, Category:Abc + Xow_ns_mgr ns_mgr = (Xow_ns_mgr)ns_mgr_hash.Get_by_bry(wiki_abrv); + rv.Init(Xow_ns_.Id_main, 0); // default to Main ns + int ttl_len = ttl.length; + int colon_pos = Bry_finder.Find_fwd(ttl, Byte_ascii.Colon, 0, ttl_len); if (colon_pos == Bry_finder.Not_found) return; + if (ns_mgr == null) { // ns_mgr not found; load from db + wiki_abrv = Bry_.Replace(wiki_abrv, Byte_ascii.Underline, Byte_ascii.Dash); + byte[] wiki_domain = Xow_wiki_alias.Parse__domain_name(wiki_abrv, 0, wiki_abrv.length); + int site_id = tbl_site.Select_id(String_.new_utf8_(wiki_domain)); if (site_id == -1) {Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.ns_parser:unknown wmf_abrv; abrv=~{0}", wiki_abrv); return;} + ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.Utf8()); + tbl_itm.Select_all(ns_mgr, site_id); if (ns_mgr.Count() == 0) {Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.ns_parser:no ns found; abrv=~{0}", wiki_abrv); return;} + ns_mgr_hash.Add_bry_obj(wiki_abrv, ns_mgr); + } + Xow_ns ns = ns_mgr.Names_get_or_null(ttl, 0, colon_pos); if (ns == null) return; // not a ns; EX: "No_namespace:Page_title" + rv.Init(ns.Id(), colon_pos + 1); + } +} +class Xob_wbase_ns_parser_rslt { + public int Ns_id() {return ns_id;} private int ns_id; + public int Ttl_bgn() {return ttl_bgn;} private int ttl_bgn; + public void Init(int ns_id, int ttl_bgn) { + this.ns_id = ns_id; this.ttl_bgn = ttl_bgn; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java index fa0ace4f3..54bd89ee1 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java @@ -18,104 +18,41 @@ along with this program. If not, see . package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; import gplx.json.*; import gplx.ios.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*; import gplx.xowa.wikis.data.tbls.*; public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { + private Json_parser parser; private Xob_wbase_ns_parser ns_parser; private final Xob_wbase_ns_parser_rslt ns_parser_rslt = new Xob_wbase_ns_parser_rslt(); public Xob_wdata_qid_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;} public abstract String Wkr_key(); public abstract void Qid_bgn(); - public abstract void Qid_add(byte[] wiki_key, Xow_ns ns, byte[] ttl, byte[] qid); + public abstract void Qid_add(byte[] wiki_key, int ns_id, byte[] ttl, byte[] qid); public abstract void Qid_end(); public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { this.Init_dump(this.Wkr_key(), wiki.Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "qid")); // NOTE: must pass in correct make_dir in order to delete earlier version (else make_dirs will append) - parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); + this.parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); + this.ns_parser = new Xob_wbase_ns_parser(Xowmf_site_tbl.Get_conn_or_new(bldr.App().Fsys_mgr().Root_dir())); this.Qid_bgn(); - } private Json_parser parser; + } public void Wkr_run(Xowd_page_itm page) { if (page.Ns_id() != Xow_ns_.Id_main) return; // qid pages are only in the Main namespace Json_doc jdoc = parser.Parse(page.Text()); - if (jdoc == null) { - bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_utf8_(page.Ttl_page_db())); - return; - } + if (jdoc == null) {bldr.Usr_dlg().Warn_many("", "", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_utf8_(page.Ttl_page_db())); return;} Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc); - byte[] qid = wdoc_parser.Parse_qid(jdoc); + byte[] qid = wdoc_parser.Parse_qid(jdoc); + Bry_bfr tmp_bfr = Bry_bfr.reset_(255); OrderedHash sitelinks = wdoc_parser.Parse_sitelinks(qid, jdoc); int sitelinks_len = sitelinks.Count(); if (sitelinks_len == 0) return; // no subs; return; - Wdata_sitelink_itm main_sitelink = null; // SEE:NOTE_1:non-english non-main titles - for (int i = 0; i < sitelinks_len; i++) { // iterate links; find main_sitelink (hopefully enwiki) + for (int i = 0; i < sitelinks_len; i++) { // iterate sitelinks Wdata_sitelink_itm sitelink = (Wdata_sitelink_itm)sitelinks.FetchAt(i); - byte[] xwiki_key = sitelink.Site(); - if ( i == 0 // assume 1st item is mainlink_data; needed for null checks; also, if no links are enwiki, then hope / assume that first link will be to an article in correct ns - || Bry_.Eq(xwiki_key, Xwiki_key_en) // assume enwiki item is to correct ns - ) - main_sitelink = sitelink; - } - - Xoa_ttl core_ttl = Xoa_ttl.parse_(wiki, main_sitelink.Name()); // NOTE: parse ttl to get ns; this may still be inaccurate as it is using wikidata's ns, not enwiki's; DATE:2014-07-23 - Xow_ns core_ns = core_ttl.Ns(); - boolean core_ns_is_main = core_ns.Id_main(); - - for (int i = 0; i < sitelinks_len; i++) { // iterate links again; do parsing, but assume any ns is same as enwiki - Wdata_sitelink_itm sitelink = (Wdata_sitelink_itm)sitelinks.FetchAt(i); - byte[] data_ttl_bry = sitelink.Name(); - byte[] actl_ttl = null; - if (core_ns_is_main) { - Xoa_ttl data_ttl = Xoa_ttl.parse_(wiki, data_ttl_bry); - actl_ttl = data_ttl.Page_db(); - } - else { // naive extract ttl based on colon; note that upper casing 1st letter is not needed, b/c ttls should be already cased correctly; EX: Aide:Page_a does not need uppercasing of "P" - int colon_pos = Bry_finder.Find_fwd(data_ttl_bry, Byte_ascii.Colon); - int data_ttl_len = data_ttl_bry.length; - if (colon_pos == Bry_.NotFound || colon_pos == data_ttl_len - 1) { - bldr.App().Usr_dlg().Log_many(GRP_KEY, "ns_not_found", "namespace not found; qid=~{0} ns=~{1} ttl=~{2}", qid, core_ns.Name_str(), data_ttl_bry); - actl_ttl = data_ttl_bry; - } - else - actl_ttl = Bry_.Mid(data_ttl_bry, colon_pos + 1, data_ttl_len); - } - this.Qid_add(sitelink.Site(), core_ns, actl_ttl, qid); + byte[] sitelink_site = sitelink.Site(), sitelink_ttl = sitelink.Name(); + ns_parser.Find(ns_parser_rslt, sitelink_site, sitelink_ttl); + int sitelink_ns = ns_parser_rslt.Ns_id(); + if (sitelink_ns != Xow_ns_.Id_main) // ttl not in main; chop off ns portion; EX:Aide:French_title -> French_title + sitelink_ttl = Bry_.Mid(sitelink_ttl, ns_parser_rslt.Ttl_bgn(), sitelink_ttl.length); + sitelink_ttl = wiki.Lang().Case_mgr().Case_build_1st_upper(tmp_bfr, sitelink_ttl, 0, sitelink_ttl.length); + this.Qid_add(sitelink.Site(), sitelink_ns, sitelink_ttl, qid); } } public void Wkr_end() { this.Qid_end(); - } static final byte[] Xwiki_key_en = Bry_.new_ascii_("enwiki"); - - public void Wkr_print() {} - private static final String GRP_KEY = "xowa.wdata.qid_wkr"; -} -class Wdata_idx_bldr_qid extends Wdata_idx_mgr_base { - public Wdata_idx_bldr_qid Ctor(Xob_wdata_qid_base wkr, Xob_bldr bldr, Xowe_wiki wiki, int dump_fil_len) {super.Ctor(wkr, bldr, wiki, dump_fil_len); return this;} - public void Add(String wiki_key, Xow_ns ns, byte[] ttl, byte[] qid) { - Wdata_idx_wtr wtr = Get_or_new(wiki_key, ns); - wtr.Write(ttl, qid); - } - Wdata_idx_wtr Get_or_new(String wiki_key, Xow_ns ns) { - String wtr_key = wiki_key + "|" + ns.Num_str(); - Object rv = hash.Fetch(wtr_key); - if (rv == null) { - Wdata_idx_wtr wtr = Wdata_idx_wtr.new_qid_(wiki, wiki_key, ns.Num_str(), dump_fil_len); - hash.Add(wtr_key, wtr); - return wtr; - } - return (Wdata_idx_wtr)rv; } + public void Wkr_print() {} } -/* -NOTE_1:non-english non-main titles -The problem is that sitelinks have full titles which namespace names. EX:frwiki|Aide:Page1 -. there is no way to know that "Aide" is "ns 6" in frwiki without loading up the ns names of frwiki -. furthermore, ttls can have ":" in the main namespace; EX:frwiki|Aidex:Page1 is actually in ns 0 -The ideal approach is to load up a ns_mgr for every wiki. this is problematic: -. memory space: potentially 800+ wikis -. data availability: wikidata dump does not have ns names for other wikis, so they need to be provided beforehand (in a new xowa.gfs file) -So, for now, employ the following workaround: -. find the ns of the baseline sitelink: (a) enwiki; (b) wiki; (c) 1st (not commons) -. parse each sitelink -.. if a sitelink has no ":", it must be in the main ns -.. if a sitelink has a ":" -... try to parse import wikidata.org's ns_mgr. this will find simple ns like "Category", "File", etc. -... if no ns, use the ns of the baseline sitelink -Note that this approach still fails in following situations -. baseline sitelink is in non-English ns.*; EX: fr.w|Aide:Page1 en.d|Help:Page1; fr.w is identified as main ns but en.d is put in Help ns -. the wrong sitelink is chosen as baseline; EX:: en.w|Category:Page1 de.w|Page1 es.w|Page1 ru.w|MainNs:Page1; ru.w is put in Category Ns -. a non-English title happens to have an English ns name in its main ns; EX:fr.w|Category:Page1; fr.w should be in Main ns (since no "Category" ns name in fr.w), but put in Category -*/ diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java index 1299ed3b6..e677fe792 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java @@ -17,9 +17,13 @@ along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; import org.junit.*; -import gplx.xowa.wikis.*; import gplx.xowa.tdbs.*; -public class Xob_wdata_qid_base_tst { - @Before public void init() {fxt = new gplx.xowa.bldrs.Xob_fxt().Ctor_mem();} gplx.xowa.bldrs.Xob_fxt fxt; // NOTE: reset memory instance (don't just call clear) +import gplx.xowa.wikis.*; import gplx.xowa.tdbs.*; import gplx.dbs.*; +public class Xob_wdata_qid_base_tst { + private gplx.xowa.bldrs.Xob_fxt fxt; // NOTE: reset memory instance (don't just call clear) + @Before public void init() { + this.fxt = new gplx.xowa.bldrs.Xob_fxt().Ctor_mem(); + gplx.dbs.Db_conn_bldr.I.Reg_default_mem(); + } @Test public void Basic() { fxt.doc_ary_ ( fxt.doc_wo_date_(2, "q2", Xob_wdata_pid_base_tst.json_("q2", "links", String_.Ary("enwiki", "q2_en", "frwiki", "q2_fr"))) @@ -50,7 +54,16 @@ public class Xob_wdata_qid_base_tst { .Run(new Xob_wdata_qid_txt().Ctor(fxt.Bldr(), this.fxt.Wiki())) ; } - @Test public void Ns() { + @Test public void Ns() { + // setup db + Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(fxt.App().Fsys_mgr().Root_dir()); + Xowmf_site_tbl site_tbl = new Xowmf_site_tbl(conn); + site_tbl.Insert(1, "en.wikipedia.org"); + site_tbl.Insert(2, "fr.wikipedia.org"); + Xowmf_ns_tbl ns_tbl = new Xowmf_ns_tbl(conn); + ns_tbl.Insert(1, Xow_ns_.Id_help, Xow_ns_case_.Id_1st, Bry_.new_ascii_("Help"), Bry_.Empty); + ns_tbl.Insert(2, Xow_ns_.Id_help, Xow_ns_case_.Id_1st, Bry_.new_ascii_("Aide"), Bry_.Empty); + // run test fxt.doc_ary_ ( fxt.doc_wo_date_(1, "11", Xob_wdata_pid_base_tst.json_("q1", "links", String_.Ary("enwiki", "Help:Q1_en", "frwiki", "Aide:Q1_fr"))) ) diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java index 8d988ea10..39bfa22d9 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java @@ -30,8 +30,8 @@ public class Xob_wdata_qid_sql extends Xob_wdata_qid_base { tbl.Create_tbl(); tbl.Insert_bgn(); } - @Override public void Qid_add(byte[] wiki_key, Xow_ns ns, byte[] ttl, byte[] qid) { - tbl.Insert_cmd_by_batch(wiki_key, ns.Id(), ttl, qid); + @Override public void Qid_add(byte[] wiki_key, int ns_id, byte[] ttl, byte[] qid) { + tbl.Insert_cmd_by_batch(wiki_key, ns_id, ttl, qid); } @Override public void Qid_end() { tbl.Insert_end(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java index 599f3253b..d19b6ae71 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java @@ -17,15 +17,31 @@ along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; public class Xob_wdata_qid_txt extends Xob_wdata_qid_base { - @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_tdb_text_wdata_qid;} - - Wdata_idx_bldr_qid qid_bldr; + private Wdata_idx_bldr_qid qid_bldr; + @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_tdb_text_wdata_qid;} @Override public void Qid_bgn() {qid_bldr = new Wdata_idx_bldr_qid().Ctor(this, bldr, wiki, dump_fil_len);} - @Override public void Qid_add(byte[] wiki_key, Xow_ns ns, byte[] ttl, byte[] qid) { - qid_bldr.Add(String_.new_utf8_(wiki_key), ns, ttl, qid); + @Override public void Qid_add(byte[] wiki_key, int ns_id, byte[] ttl, byte[] qid) { + qid_bldr.Add(String_.new_utf8_(wiki_key), Int_.Xto_str_pad_bgn_zero(ns_id, 3), ttl, qid); } @Override public void Qid_end() { qid_bldr.Flush(); qid_bldr.Make(); } } +class Wdata_idx_bldr_qid extends Wdata_idx_mgr_base { + public Wdata_idx_bldr_qid Ctor(Xob_wdata_qid_base wkr, Xob_bldr bldr, Xowe_wiki wiki, int dump_fil_len) {super.Ctor(wkr, bldr, wiki, dump_fil_len); return this;} + public void Add(String wiki_key, String ns_num_str, byte[] ttl, byte[] qid) { + Wdata_idx_wtr wtr = Get_or_new(wiki_key, ns_num_str); + wtr.Write(ttl, qid); + } + private Wdata_idx_wtr Get_or_new(String wiki_key, String ns_num_str) { + String wtr_key = wiki_key + "|" + ns_num_str; + Object rv = hash.Fetch(wtr_key); + if (rv == null) { + Wdata_idx_wtr wtr = Wdata_idx_wtr.new_qid_(wiki, wiki_key, ns_num_str, dump_fil_len); + hash.Add(wtr_key, wtr); + return wtr; + } + return (Wdata_idx_wtr)rv; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java new file mode 100644 index 000000000..d56149a32 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java @@ -0,0 +1,874 @@ +/* +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.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +interface Xow_wmf_api_wkr { + void Api_init(); + void Api_term(); + boolean Api_wiki_enabled(String wiki_domain); + String Api_qargs(); + boolean Api_exec(String wiki_domain, byte[] rslt); +} +class Xow_wmf_api_mgr { + public void Trg_engine_key(String v) {this.trg_engine_key = v;} private String trg_engine_key = gplx.ios.IoEngine_.SysKey; + public void Api_exec(Xow_wmf_api_wkr wkr) {this.Api_exec(Wikis, wkr);} + public void Api_exec(String[] wiki_ary, Xow_wmf_api_wkr wkr) { + Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg(); + int len = wiki_ary.length; + wkr.Api_init(); + for (int i = 0; i < len; ++i) { + String wiki = wiki_ary[i]; + if (!wkr.Api_wiki_enabled(wiki)) continue; + String call = String_.Format("https://{0}/w/api.php?{1}", wiki, wkr.Api_qargs()); // EX: https://en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces + usr_dlg.Prog_many("", "", "wmf_api:calling; wiki~{0} api=~{1}", wiki, call); + byte[] rslt = Io_mgr._.DownloadFil_args("", null).Trg_engine_key_(trg_engine_key).Exec_as_bry(call); + if (rslt == null) {usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); continue;} + wkr.Api_exec(wiki, rslt); + } + wkr.Api_term(); + } + public static String[] Wikis = new String[] +{ "commons.wikimedia.org" +, "species.wikimedia.org" +, "meta.wikimedia.org" +, "incubator.wikimedia.org" +, "www.wikidata.org" +, "www.mediawiki.org" +, "wikimediafoundation.org" +, "en.wikipedia.org" +, "en.wiktionary.org" +, "en.wikisource.org" +, "en.wikibooks.org" +, "en.wikiversity.org" +, "en.wikiquote.org" +, "en.wikinews.org" +, "en.wikivoyage.org" +, "de.wikipedia.org" +, "de.wiktionary.org" +, "de.wikisource.org" +, "de.wikibooks.org" +, "de.wikiversity.org" +, "de.wikiquote.org" +, "de.wikinews.org" +, "de.wikivoyage.org" +, "es.wikipedia.org" +, "es.wiktionary.org" +, "es.wikisource.org" +, "es.wikibooks.org" +, "es.wikiversity.org" +, "es.wikiquote.org" +, "es.wikinews.org" +, "es.wikivoyage.org" +, "fr.wikipedia.org" +, "fr.wiktionary.org" +, "fr.wikisource.org" +, "fr.wikibooks.org" +, "fr.wikiversity.org" +, "fr.wikiquote.org" +, "fr.wikinews.org" +, "fr.wikivoyage.org" +, "it.wikipedia.org" +, "it.wiktionary.org" +, "it.wikisource.org" +, "it.wikibooks.org" +, "it.wikiversity.org" +, "it.wikiquote.org" +, "it.wikinews.org" +, "it.wikivoyage.org" +, "ja.wikipedia.org" +, "ja.wiktionary.org" +, "ja.wikisource.org" +, "ja.wikibooks.org" +, "ja.wikiversity.org" +, "ja.wikiquote.org" +, "ja.wikinews.org" +, "nl.wikipedia.org" +, "nl.wiktionary.org" +, "nl.wikisource.org" +, "nl.wikibooks.org" +, "nl.wikiquote.org" +, "nl.wikinews.org" +, "nl.wikivoyage.org" +, "nl.wikimedia.org" +, "pl.wikipedia.org" +, "pl.wiktionary.org" +, "pl.wikisource.org" +, "pl.wikibooks.org" +, "pl.wikiquote.org" +, "pl.wikinews.org" +, "pl.wikivoyage.org" +, "pl.wikimedia.org" +, "pt.wikipedia.org" +, "pt.wiktionary.org" +, "pt.wikisource.org" +, "pt.wikibooks.org" +, "pt.wikiversity.org" +, "pt.wikiquote.org" +, "pt.wikinews.org" +, "pt.wikivoyage.org" +, "ru.wikipedia.org" +, "ru.wiktionary.org" +, "ru.wikisource.org" +, "ru.wikibooks.org" +, "ru.wikiversity.org" +, "ru.wikiquote.org" +, "ru.wikinews.org" +, "ru.wikivoyage.org" +, "ru.wikimedia.org" +, "ar.wikipedia.org" +, "ar.wiktionary.org" +, "ar.wikisource.org" +, "ar.wikibooks.org" +, "ar.wikiversity.org" +, "ar.wikiquote.org" +, "ar.wikinews.org" +, "ar.wikimedia.org" +, "ca.wikipedia.org" +, "ca.wiktionary.org" +, "ca.wikisource.org" +, "ca.wikibooks.org" +, "ca.wikiquote.org" +, "ca.wikinews.org" +, "ca.wikimedia.org" +, "cs.wikipedia.org" +, "cs.wiktionary.org" +, "cs.wikisource.org" +, "cs.wikibooks.org" +, "cs.wikiversity.org" +, "cs.wikiquote.org" +, "cs.wikinews.org" +, "da.wikipedia.org" +, "da.wiktionary.org" +, "da.wikisource.org" +, "da.wikibooks.org" +, "da.wikiquote.org" +, "eo.wikipedia.org" +, "eo.wiktionary.org" +, "eo.wikisource.org" +, "eo.wikibooks.org" +, "eo.wikiquote.org" +, "eo.wikinews.org" +, "fa.wikipedia.org" +, "fa.wiktionary.org" +, "fa.wikisource.org" +, "fa.wikibooks.org" +, "fa.wikiquote.org" +, "fa.wikinews.org" +, "fa.wikivoyage.org" +, "fi.wikipedia.org" +, "fi.wiktionary.org" +, "fi.wikisource.org" +, "fi.wikibooks.org" +, "fi.wikiversity.org" +, "fi.wikiquote.org" +, "fi.wikinews.org" +, "fi.wikimedia.org" +, "hu.wikipedia.org" +, "hu.wiktionary.org" +, "hu.wikisource.org" +, "hu.wikibooks.org" +, "hu.wikiquote.org" +, "hu.wikinews.org" +, "id.wikipedia.org" +, "id.wiktionary.org" +, "id.wikisource.org" +, "id.wikibooks.org" +, "id.wikiquote.org" +, "kk.wikipedia.org" +, "kk.wiktionary.org" +, "kk.wikibooks.org" +, "kk.wikiquote.org" +, "ko.wikipedia.org" +, "ko.wiktionary.org" +, "ko.wikisource.org" +, "ko.wikibooks.org" +, "ko.wikiversity.org" +, "ko.wikiquote.org" +, "ko.wikinews.org" +, "lt.wikipedia.org" +, "lt.wiktionary.org" +, "lt.wikisource.org" +, "lt.wikibooks.org" +, "lt.wikiquote.org" +, "no.wikipedia.org" +, "no.wiktionary.org" +, "no.wikisource.org" +, "no.wikibooks.org" +, "no.wikiquote.org" +, "no.wikinews.org" +, "no.wikimedia.org" +, "ro.wikipedia.org" +, "ro.wiktionary.org" +, "ro.wikisource.org" +, "ro.wikibooks.org" +, "ro.wikiquote.org" +, "ro.wikinews.org" +, "ro.wikivoyage.org" +, "sk.wikipedia.org" +, "sk.wiktionary.org" +, "sk.wikisource.org" +, "sk.wikibooks.org" +, "sk.wikiquote.org" +, "sr.wikipedia.org" +, "sr.wiktionary.org" +, "sr.wikisource.org" +, "sr.wikibooks.org" +, "sr.wikiquote.org" +, "sr.wikinews.org" +, "sv.wikipedia.org" +, "sv.wiktionary.org" +, "sv.wikisource.org" +, "sv.wikibooks.org" +, "sv.wikiversity.org" +, "sv.wikiquote.org" +, "sv.wikinews.org" +, "sv.wikivoyage.org" +, "tr.wikipedia.org" +, "tr.wiktionary.org" +, "tr.wikisource.org" +, "tr.wikibooks.org" +, "tr.wikiquote.org" +, "tr.wikinews.org" +, "tr.wikimedia.org" +, "uk.wikipedia.org" +, "uk.wiktionary.org" +, "uk.wikisource.org" +, "uk.wikibooks.org" +, "uk.wikiquote.org" +, "uk.wikinews.org" +, "uk.wikivoyage.org" +, "uk.wikimedia.org" +, "vi.wikipedia.org" +, "vi.wiktionary.org" +, "vi.wikisource.org" +, "vi.wikibooks.org" +, "vi.wikiquote.org" +, "vi.wikivoyage.org" +, "zh.wikipedia.org" +, "zh.wiktionary.org" +, "zh.wikisource.org" +, "zh.wikibooks.org" +, "zh.wikiquote.org" +, "zh.wikinews.org" +, "zh.wikivoyage.org" +, "bg.wikipedia.org" +, "bg.wiktionary.org" +, "bg.wikisource.org" +, "bg.wikibooks.org" +, "bg.wikiquote.org" +, "bg.wikinews.org" +, "el.wikipedia.org" +, "el.wiktionary.org" +, "el.wikisource.org" +, "el.wikibooks.org" +, "el.wikiversity.org" +, "el.wikiquote.org" +, "el.wikinews.org" +, "el.wikivoyage.org" +, "et.wikipedia.org" +, "et.wiktionary.org" +, "et.wikisource.org" +, "et.wikibooks.org" +, "et.wikiquote.org" +, "et.wikimedia.org" +, "eu.wikipedia.org" +, "eu.wiktionary.org" +, "eu.wikibooks.org" +, "eu.wikiquote.org" +, "gl.wikipedia.org" +, "gl.wiktionary.org" +, "gl.wikisource.org" +, "gl.wikibooks.org" +, "gl.wikiquote.org" +, "he.wikipedia.org" +, "he.wiktionary.org" +, "he.wikisource.org" +, "he.wikibooks.org" +, "he.wikiquote.org" +, "he.wikinews.org" +, "he.wikivoyage.org" +, "hr.wikipedia.org" +, "hr.wiktionary.org" +, "hr.wikisource.org" +, "hr.wikibooks.org" +, "hr.wikiquote.org" +, "ms.wikipedia.org" +, "ms.wiktionary.org" +, "ms.wikibooks.org" +, "nn.wikipedia.org" +, "nn.wiktionary.org" +, "nn.wikiquote.org" +, "sh.wikipedia.org" +, "sh.wiktionary.org" +, "simple.wikipedia.org" +, "simple.wiktionary.org" +, "simple.wikibooks.org" +, "simple.wikiquote.org" +, "sl.wikipedia.org" +, "sl.wiktionary.org" +, "sl.wikisource.org" +, "sl.wikibooks.org" +, "sl.wikiversity.org" +, "sl.wikiquote.org" +, "th.wikipedia.org" +, "th.wiktionary.org" +, "th.wikisource.org" +, "th.wikibooks.org" +, "th.wikiquote.org" +, "th.wikinews.org" +, "vo.wikipedia.org" +, "vo.wiktionary.org" +, "vo.wikibooks.org" +, "vo.wikiquote.org" +, "hi.wikipedia.org" +, "hi.wiktionary.org" +, "hi.wikibooks.org" +, "hi.wikiquote.org" +, "ia.wikipedia.org" +, "ia.wiktionary.org" +, "ia.wikibooks.org" +, "la.wikipedia.org" +, "la.wiktionary.org" +, "la.wikisource.org" +, "la.wikibooks.org" +, "la.wikiquote.org" +, "aa.wikipedia.org" +, "aa.wiktionary.org" +, "aa.wikibooks.org" +, "ab.wikipedia.org" +, "ab.wiktionary.org" +, "ace.wikipedia.org" +, "af.wikipedia.org" +, "af.wiktionary.org" +, "af.wikibooks.org" +, "af.wikiquote.org" +, "ak.wikipedia.org" +, "ak.wiktionary.org" +, "ak.wikibooks.org" +, "als.wikipedia.org" +, "als.wiktionary.org" +, "als.wikibooks.org" +, "als.wikiquote.org" +, "am.wikipedia.org" +, "am.wiktionary.org" +, "am.wikiquote.org" +, "an.wikipedia.org" +, "an.wiktionary.org" +, "ang.wikipedia.org" +, "ang.wiktionary.org" +, "ang.wikisource.org" +, "ang.wikibooks.org" +, "ang.wikiquote.org" +, "arc.wikipedia.org" +, "arz.wikipedia.org" +, "as.wikipedia.org" +, "as.wiktionary.org" +, "as.wikisource.org" +, "as.wikibooks.org" +, "ast.wikipedia.org" +, "ast.wiktionary.org" +, "ast.wikibooks.org" +, "ast.wikiquote.org" +, "av.wikipedia.org" +, "av.wiktionary.org" +, "ay.wikipedia.org" +, "ay.wiktionary.org" +, "ay.wikibooks.org" +, "az.wikipedia.org" +, "az.wiktionary.org" +, "az.wikisource.org" +, "az.wikibooks.org" +, "az.wikiquote.org" +, "ba.wikipedia.org" +, "ba.wikibooks.org" +, "bar.wikipedia.org" +, "bat-smg.wikipedia.org" +, "bcl.wikipedia.org" +, "be.wikipedia.org" +, "be.wiktionary.org" +, "be.wikisource.org" +, "be.wikibooks.org" +, "be.wikiquote.org" +, "be.wikimedia.org" +, "be-x-old.wikipedia.org" +, "bh.wikipedia.org" +, "bh.wiktionary.org" +, "bi.wikipedia.org" +, "bi.wiktionary.org" +, "bi.wikibooks.org" +, "bjn.wikipedia.org" +, "bm.wikipedia.org" +, "bm.wiktionary.org" +, "bm.wikibooks.org" +, "bm.wikiquote.org" +, "bn.wikipedia.org" +, "bn.wiktionary.org" +, "bn.wikisource.org" +, "bn.wikibooks.org" +, "bo.wikipedia.org" +, "bo.wiktionary.org" +, "bo.wikibooks.org" +, "bpy.wikipedia.org" +, "br.wikipedia.org" +, "br.wiktionary.org" +, "br.wikisource.org" +, "br.wikiquote.org" +, "br.wikimedia.org" +, "bs.wikipedia.org" +, "bs.wiktionary.org" +, "bs.wikisource.org" +, "bs.wikibooks.org" +, "bs.wikiquote.org" +, "bs.wikinews.org" +, "bug.wikipedia.org" +, "bxr.wikipedia.org" +, "cbk-zam.wikipedia.org" +, "cdo.wikipedia.org" +, "ce.wikipedia.org" +, "ceb.wikipedia.org" +, "ch.wikipedia.org" +, "ch.wiktionary.org" +, "ch.wikibooks.org" +, "cho.wikipedia.org" +, "chr.wikipedia.org" +, "chr.wiktionary.org" +, "chy.wikipedia.org" +, "ckb.wikipedia.org" +, "co.wikipedia.org" +, "co.wiktionary.org" +, "co.wikibooks.org" +, "co.wikiquote.org" +, "co.wikimedia.org" +, "cr.wikipedia.org" +, "cr.wiktionary.org" +, "cr.wikiquote.org" +, "crh.wikipedia.org" +, "csb.wikipedia.org" +, "csb.wiktionary.org" +, "cu.wikipedia.org" +, "cv.wikipedia.org" +, "cv.wikibooks.org" +, "cy.wikipedia.org" +, "cy.wiktionary.org" +, "cy.wikisource.org" +, "cy.wikibooks.org" +, "cy.wikiquote.org" +, "diq.wikipedia.org" +, "dsb.wikipedia.org" +, "dv.wikipedia.org" +, "dv.wiktionary.org" +, "dz.wikipedia.org" +, "dz.wiktionary.org" +, "ee.wikipedia.org" +, "eml.wikipedia.org" +, "ext.wikipedia.org" +, "ff.wikipedia.org" +, "fiu-vro.wikipedia.org" +, "fj.wikipedia.org" +, "fj.wiktionary.org" +, "fo.wikipedia.org" +, "fo.wiktionary.org" +, "fo.wikisource.org" +, "frp.wikipedia.org" +, "frr.wikipedia.org" +, "fur.wikipedia.org" +, "fy.wikipedia.org" +, "fy.wiktionary.org" +, "fy.wikibooks.org" +, "ga.wikipedia.org" +, "ga.wiktionary.org" +, "ga.wikibooks.org" +, "ga.wikiquote.org" +, "gag.wikipedia.org" +, "gan.wikipedia.org" +, "gd.wikipedia.org" +, "gd.wiktionary.org" +, "glk.wikipedia.org" +, "gn.wikipedia.org" +, "gn.wiktionary.org" +, "gn.wikibooks.org" +, "got.wikipedia.org" +, "got.wikibooks.org" +, "gu.wikipedia.org" +, "gu.wiktionary.org" +, "gu.wikisource.org" +, "gu.wikibooks.org" +, "gu.wikiquote.org" +, "gv.wikipedia.org" +, "gv.wiktionary.org" +, "ha.wikipedia.org" +, "ha.wiktionary.org" +, "hak.wikipedia.org" +, "haw.wikipedia.org" +, "hif.wikipedia.org" +, "ho.wikipedia.org" +, "hsb.wikipedia.org" +, "hsb.wiktionary.org" +, "ht.wikipedia.org" +, "ht.wikisource.org" +, "hy.wikipedia.org" +, "hy.wiktionary.org" +, "hy.wikisource.org" +, "hy.wikibooks.org" +, "hy.wikiquote.org" +, "hz.wikipedia.org" +, "ie.wikipedia.org" +, "ie.wiktionary.org" +, "ie.wikibooks.org" +, "ig.wikipedia.org" +, "ii.wikipedia.org" +, "ik.wikipedia.org" +, "ik.wiktionary.org" +, "ilo.wikipedia.org" +, "io.wikipedia.org" +, "io.wiktionary.org" +, "is.wikipedia.org" +, "is.wiktionary.org" +, "is.wikisource.org" +, "is.wikibooks.org" +, "is.wikiquote.org" +, "iu.wikipedia.org" +, "iu.wiktionary.org" +, "jbo.wikipedia.org" +, "jbo.wiktionary.org" +, "jv.wikipedia.org" +, "jv.wiktionary.org" +, "ka.wikipedia.org" +, "ka.wiktionary.org" +, "ka.wikibooks.org" +, "ka.wikiquote.org" +, "kaa.wikipedia.org" +, "kab.wikipedia.org" +, "kbd.wikipedia.org" +, "kg.wikipedia.org" +, "ki.wikipedia.org" +, "kj.wikipedia.org" +, "kl.wikipedia.org" +, "kl.wiktionary.org" +, "km.wikipedia.org" +, "km.wiktionary.org" +, "km.wikibooks.org" +, "kn.wikipedia.org" +, "kn.wiktionary.org" +, "kn.wikisource.org" +, "kn.wikibooks.org" +, "kn.wikiquote.org" +, "koi.wikipedia.org" +, "kr.wikipedia.org" +, "kr.wikiquote.org" +, "krc.wikipedia.org" +, "ks.wikipedia.org" +, "ks.wiktionary.org" +, "ks.wikibooks.org" +, "ks.wikiquote.org" +, "ksh.wikipedia.org" +, "ku.wikipedia.org" +, "ku.wiktionary.org" +, "ku.wikibooks.org" +, "ku.wikiquote.org" +, "kv.wikipedia.org" +, "kw.wikipedia.org" +, "kw.wiktionary.org" +, "kw.wikiquote.org" +, "ky.wikipedia.org" +, "ky.wiktionary.org" +, "ky.wikibooks.org" +, "ky.wikiquote.org" +, "lad.wikipedia.org" +, "lb.wikipedia.org" +, "lb.wiktionary.org" +, "lb.wikibooks.org" +, "lb.wikiquote.org" +, "lbe.wikipedia.org" +, "lez.wikipedia.org" +, "lg.wikipedia.org" +, "li.wikipedia.org" +, "li.wiktionary.org" +, "li.wikisource.org" +, "li.wikibooks.org" +, "li.wikiquote.org" +, "lij.wikipedia.org" +, "lmo.wikipedia.org" +, "ln.wikipedia.org" +, "ln.wiktionary.org" +, "ln.wikibooks.org" +, "lo.wikipedia.org" +, "lo.wiktionary.org" +, "ltg.wikipedia.org" +, "lv.wikipedia.org" +, "lv.wiktionary.org" +, "lv.wikibooks.org" +, "mai.wikipedia.org" +, "map-bms.wikipedia.org" +, "mdf.wikipedia.org" +, "mg.wikipedia.org" +, "mg.wiktionary.org" +, "mg.wikibooks.org" +, "mh.wikipedia.org" +, "mh.wiktionary.org" +, "mhr.wikipedia.org" +, "mi.wikipedia.org" +, "mi.wiktionary.org" +, "mi.wikibooks.org" +, "min.wikipedia.org" +, "mk.wikipedia.org" +, "mk.wiktionary.org" +, "mk.wikisource.org" +, "mk.wikibooks.org" +, "mk.wikimedia.org" +, "ml.wikipedia.org" +, "ml.wiktionary.org" +, "ml.wikisource.org" +, "ml.wikibooks.org" +, "ml.wikiquote.org" +, "mn.wikipedia.org" +, "mn.wiktionary.org" +, "mn.wikibooks.org" +, "mo.wikipedia.org" +, "mo.wiktionary.org" +, "mr.wikipedia.org" +, "mr.wiktionary.org" +, "mr.wikisource.org" +, "mr.wikibooks.org" +, "mr.wikiquote.org" +, "mrj.wikipedia.org" +, "mt.wikipedia.org" +, "mt.wiktionary.org" +, "mus.wikipedia.org" +, "mwl.wikipedia.org" +, "my.wikipedia.org" +, "my.wiktionary.org" +, "my.wikibooks.org" +, "myv.wikipedia.org" +, "mzn.wikipedia.org" +, "na.wikipedia.org" +, "na.wiktionary.org" +, "na.wikibooks.org" +, "na.wikiquote.org" +, "nah.wikipedia.org" +, "nah.wiktionary.org" +, "nah.wikibooks.org" +, "nap.wikipedia.org" +, "nds.wikipedia.org" +, "nds.wiktionary.org" +, "nds.wikibooks.org" +, "nds.wikiquote.org" +, "nds-nl.wikipedia.org" +, "ne.wikipedia.org" +, "ne.wiktionary.org" +, "ne.wikibooks.org" +, "new.wikipedia.org" +, "ng.wikipedia.org" +, "nov.wikipedia.org" +, "nrm.wikipedia.org" +, "nso.wikipedia.org" +, "nv.wikipedia.org" +, "ny.wikipedia.org" +, "oc.wikipedia.org" +, "oc.wiktionary.org" +, "oc.wikibooks.org" +, "om.wikipedia.org" +, "om.wiktionary.org" +, "or.wikipedia.org" +, "or.wiktionary.org" +, "or.wikisource.org" +, "os.wikipedia.org" +, "pa.wikipedia.org" +, "pa.wiktionary.org" +, "pa.wikibooks.org" +, "pag.wikipedia.org" +, "pam.wikipedia.org" +, "pap.wikipedia.org" +, "pcd.wikipedia.org" +, "pdc.wikipedia.org" +, "pfl.wikipedia.org" +, "pi.wikipedia.org" +, "pi.wiktionary.org" +, "pih.wikipedia.org" +, "pms.wikipedia.org" +, "pnb.wikipedia.org" +, "pnb.wiktionary.org" +, "pnt.wikipedia.org" +, "ps.wikipedia.org" +, "ps.wiktionary.org" +, "ps.wikibooks.org" +, "qu.wikipedia.org" +, "qu.wiktionary.org" +, "qu.wikibooks.org" +, "qu.wikiquote.org" +, "rm.wikipedia.org" +, "rm.wiktionary.org" +, "rm.wikibooks.org" +, "rmy.wikipedia.org" +, "rn.wikipedia.org" +, "rn.wiktionary.org" +, "roa-rup.wikipedia.org" +, "roa-rup.wiktionary.org" +, "roa-tara.wikipedia.org" +, "rue.wikipedia.org" +, "rw.wikipedia.org" +, "rw.wiktionary.org" +, "sa.wikipedia.org" +, "sa.wiktionary.org" +, "sa.wikisource.org" +, "sa.wikibooks.org" +, "sa.wikiquote.org" +, "sah.wikipedia.org" +, "sah.wikisource.org" +, "sc.wikipedia.org" +, "sc.wiktionary.org" +, "scn.wikipedia.org" +, "scn.wiktionary.org" +, "sco.wikipedia.org" +, "sd.wikipedia.org" +, "sd.wiktionary.org" +, "sd.wikinews.org" +, "se.wikipedia.org" +, "se.wikibooks.org" +, "se.wikimedia.org" +, "sg.wikipedia.org" +, "sg.wiktionary.org" +, "si.wikipedia.org" +, "si.wiktionary.org" +, "si.wikibooks.org" +, "sm.wikipedia.org" +, "sm.wiktionary.org" +, "sn.wikipedia.org" +, "sn.wiktionary.org" +, "so.wikipedia.org" +, "so.wiktionary.org" +, "sq.wikipedia.org" +, "sq.wiktionary.org" +, "sq.wikibooks.org" +, "sq.wikiquote.org" +, "sq.wikinews.org" +, "srn.wikipedia.org" +, "ss.wikipedia.org" +, "ss.wiktionary.org" +, "st.wikipedia.org" +, "st.wiktionary.org" +, "stq.wikipedia.org" +, "su.wikipedia.org" +, "su.wiktionary.org" +, "su.wikibooks.org" +, "su.wikiquote.org" +, "sw.wikipedia.org" +, "sw.wiktionary.org" +, "sw.wikibooks.org" +, "szl.wikipedia.org" +, "ta.wikipedia.org" +, "ta.wiktionary.org" +, "ta.wikisource.org" +, "ta.wikibooks.org" +, "ta.wikiquote.org" +, "ta.wikinews.org" +, "te.wikipedia.org" +, "te.wiktionary.org" +, "te.wikisource.org" +, "te.wikibooks.org" +, "te.wikiquote.org" +, "tet.wikipedia.org" +, "tg.wikipedia.org" +, "tg.wiktionary.org" +, "tg.wikibooks.org" +, "ti.wikipedia.org" +, "ti.wiktionary.org" +, "tk.wikipedia.org" +, "tk.wiktionary.org" +, "tk.wikibooks.org" +, "tk.wikiquote.org" +, "tl.wikipedia.org" +, "tl.wiktionary.org" +, "tl.wikibooks.org" +, "tn.wikipedia.org" +, "tn.wiktionary.org" +, "to.wikipedia.org" +, "to.wiktionary.org" +, "tpi.wikipedia.org" +, "tpi.wiktionary.org" +, "ts.wikipedia.org" +, "ts.wiktionary.org" +, "tt.wikipedia.org" +, "tt.wiktionary.org" +, "tt.wikibooks.org" +, "tt.wikiquote.org" +, "tum.wikipedia.org" +, "tw.wikipedia.org" +, "tw.wiktionary.org" +, "ty.wikipedia.org" +, "tyv.wikipedia.org" +, "udm.wikipedia.org" +, "ug.wikipedia.org" +, "ug.wiktionary.org" +, "ug.wikibooks.org" +, "ug.wikiquote.org" +, "ur.wikipedia.org" +, "ur.wiktionary.org" +, "ur.wikibooks.org" +, "ur.wikiquote.org" +, "uz.wikipedia.org" +, "uz.wiktionary.org" +, "uz.wikibooks.org" +, "uz.wikiquote.org" +, "ve.wikipedia.org" +, "vec.wikipedia.org" +, "vec.wiktionary.org" +, "vec.wikisource.org" +, "vep.wikipedia.org" +, "vls.wikipedia.org" +, "wa.wikipedia.org" +, "wa.wiktionary.org" +, "wa.wikibooks.org" +, "war.wikipedia.org" +, "wo.wikipedia.org" +, "wo.wiktionary.org" +, "wo.wikiquote.org" +, "wuu.wikipedia.org" +, "xal.wikipedia.org" +, "xh.wikipedia.org" +, "xh.wiktionary.org" +, "xh.wikibooks.org" +, "xmf.wikipedia.org" +, "yi.wikipedia.org" +, "yi.wiktionary.org" +, "yi.wikisource.org" +, "yo.wikipedia.org" +, "yo.wiktionary.org" +, "yo.wikibooks.org" +, "za.wikipedia.org" +, "za.wiktionary.org" +, "za.wikibooks.org" +, "za.wikiquote.org" +, "zea.wikipedia.org" +, "zh-classical.wikipedia.org" +, "zh-min-nan.wikipedia.org" +, "zh-min-nan.wiktionary.org" +, "zh-min-nan.wikisource.org" +, "zh-min-nan.wikibooks.org" +, "zh-min-nan.wikiquote.org" +, "zh-yue.wikipedia.org" +, "zu.wikipedia.org" +, "zu.wiktionary.org" +, "zu.wikibooks.org" +}; +//, "als.wikisource.org" +//, "als.wikinews.org" +//, "nds.wikinews.org" +//, "ba.wiktionary.org" +//, "tokipona.wikibooks.org" +//, "ve.wikimedia.org" // NOTE: moved:DATE:2015-04-06 +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_wkr__ns.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_wkr__ns.java new file mode 100644 index 000000000..607faf291 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_wkr__ns.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.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +import gplx.json.*; +class Xow_wmf_api_wkr__ns implements Xow_wmf_api_wkr { + private final Json_parser parser = new Json_parser(); + private final Xowmf_site_tbl tbl_site; private final Xowmf_ns_tbl tbl_itm; + private int site_id_next = 1; + public Xow_wmf_api_wkr__ns(Xowmf_site_tbl tbl_site, Xowmf_ns_tbl tbl_itm) { + this.tbl_site = tbl_site; this.tbl_itm = tbl_itm; + } + public boolean Api_wiki_enabled(String wiki_domain) {return true;} // run against all wikis + public String Api_qargs() {return "action=query&meta=siteinfo&siprop=namespaces&format=json";} + public void Api_init() { + tbl_site.Conn().Txn_bgn(); + tbl_site.Delete_all(); + tbl_itm.Delete_all(); + } + public boolean Api_exec(String wiki_domain, byte[] rslt) { + try { + int site_id = ++site_id_next; + tbl_site.Insert(site_id, wiki_domain); + Json_doc jdoc = parser.Parse(rslt); + Json_grp ns_grp = jdoc.Get_grp(Bry_jpath); if (ns_grp == null) throw Err_.new_("wmf_api_wkr.ns:invalid json; json={0}", rslt); + int ns_len = ns_grp.Subs_len(); + for (int i = 0; i < ns_len; ++i) { + try { + Json_itm_kv kv = (Json_itm_kv)ns_grp.Subs_get_at(i); + Json_itm_nde nde = (Json_itm_nde)kv.Val(); + int ns_id = Bry_.Xto_int_or(Get_val_or_null(nde, Bry_id), Int_.MinValue); + byte ns_case = Xow_ns_case_.parse_(String_.new_utf8_(Get_val_or_null(nde, Bry_case))); + byte[] ns_name = Get_val_or_null(nde, Bry_name); + byte[] ns_canonical = Get_val_or_null(nde, Bry_canonical); + if (ns_canonical == null) ns_canonical = Bry_.Empty; // main_ns has no canonical + tbl_itm.Insert(site_id, ns_id, ns_case, ns_name, ns_canonical); + } catch (Exception e) { + Xoa_app_.Usr_dlg().Warn_many("", "", "wmf_api_wkr.ns:unknown; wiki=~{0} rslt=~{1} i=~{2} err=~{3}", wiki_domain, rslt, i, Err_.Message_gplx(e)); + continue; + } + } + tbl_site.Conn().Txn_sav(); + return true; + } catch (Exception e) { + Xoa_app_.Usr_dlg().Warn_many("", "", "wmf_api_wkr.ns:unknown; wiki=~{0} rslt=~{1} err=~{2}", wiki_domain, rslt, Err_.Message_gplx(e)); + return false; + } + } + public void Api_term() { + tbl_site.Conn().Txn_end(); + } + private byte[] Get_val_or_null(Json_itm_nde nde, byte[] key) { + Json_itm sub = nde.Subs_get_by_key(key); + Json_itm_kv sub_as_kv = (Json_itm_kv)sub; + return sub_as_kv == null ? null : sub_as_kv.Val().Data_bry(); // sub_as_kv == null when key is not present; note that "canonical" does not exist for Main ns + } + private static final byte[] Bry_query = Bry_.new_ascii_("query"), Bry_namespaces = Bry_.new_ascii_("namespaces") + , Bry_id = Bry_.new_ascii_("id"), Bry_case = Bry_.new_ascii_("case"), Bry_name = Bry_.new_ascii_("*"), Bry_canonical = Bry_.new_ascii_("canonical"); + private static final byte[][] Bry_jpath = new byte[][] {Bry_query, Bry_namespaces}; +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xowmf_site_tbl.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xowmf_site_tbl.java new file mode 100644 index 000000000..c4d3e79c0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xowmf_site_tbl.java @@ -0,0 +1,101 @@ +/* +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.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +import gplx.dbs.*; +class Xowmf_site_tbl implements RlsAble { + private static final String tbl_name = "wmf_site"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private final String fld_id, fld_name; + private final Db_conn conn; + private Db_stmt stmt_insert, stmt_select; + public Xowmf_site_tbl(Db_conn conn) { + this.conn = conn; + this.fld_id = flds.Add_int_pkey("site_id"); + this.fld_name = flds.Add_str("site_name", 255); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "name", fld_name)));} + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select = Db_stmt_.Rls(stmt_select); + } + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();} + public void Insert(int id, String name) { + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear().Val_int(fld_id, id).Val_str(fld_name, name).Exec_insert(); + } + public int Select_id(String name) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_name); + Db_rdr rdr = stmt_select.Clear().Crt_str(fld_name, name).Exec_select__rls_manual(); + try { + return rdr.Move_next() ? rdr.Read_int(fld_id) : -1; + } + finally {rdr.Rls();} + } + public static Db_conn Get_conn_or_new(Io_url xowa_root) { + Io_url wmf_data_url = xowa_root.GenSubFil_nest("bin", "any", "xowa", "cfg", "wiki", "wmf_data.sqlite3"); + Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(wmf_data_url); + Db_conn conn = conn_data.Conn(); + if (conn_data.Created()) { + Xowmf_site_tbl site_tbl = new Xowmf_site_tbl(conn); site_tbl.Create_tbl(); + Xowmf_ns_tbl itm_tbl = new Xowmf_ns_tbl(conn); itm_tbl.Create_tbl(); + } + return conn; + } +} +class Xowmf_ns_tbl implements RlsAble { + private static final String tbl_name = "wmf_ns"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private final String fld_site_id, fld_id, fld_case, fld_name, fld_canonical; + private final Db_conn conn; + private Db_stmt stmt_insert, stmt_select; + public Xowmf_ns_tbl(Db_conn conn) { + this.conn = conn; + this.fld_site_id = flds.Add_int("site_id"); + this.fld_id = flds.Add_int("ns_id"); + this.fld_case = flds.Add_byte("ns_case"); + this.fld_name = flds.Add_str("ns_name", 255); + this.fld_canonical = flds.Add_str("ns_canonical", 255); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id, fld_id)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();} + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select = Db_stmt_.Rls(stmt_select); + } + public void Insert(int site_id, int id, byte case_match, byte[] name, byte[] canonical) { + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear().Val_int(fld_site_id, site_id).Val_int(fld_id, id).Val_byte(fld_case, case_match).Val_bry_as_str(fld_name, name).Val_bry_as_str(fld_canonical, canonical).Exec_insert(); + } + public void Select_all(Xow_ns_mgr rv, int site_id) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_id); + Db_rdr rdr = stmt_select.Clear().Crt_int(fld_site_id, site_id).Exec_select__rls_manual(); + rv.Clear(); + try { + while (rdr.Move_next()) { + rv.Add_new + ( rdr.Read_int (fld_id) + , rdr.Read_bry_by_str (fld_name) + , rdr.Read_byte (fld_case) + , Bool_.N); + } + } + finally {rdr.Rls();} + rv.Init(); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java index 2caac272b..2e71e6e6a 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java @@ -22,16 +22,16 @@ public class Wdata_itemByTitle_page implements Xows_page { private static final byte[] Arg_site = Bry_.new_ascii_("site"), Arg_page = Bry_.new_ascii_("page"); public Bry_fmtr Html_fmtr() {return html_fmtr;} private Wdata_itemByTitle_cfg cfg; - public void Special_gen(Xoa_url calling_url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { + public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { if (cfg == null) cfg = (Wdata_itemByTitle_cfg)wiki.Appe().Special_mgr().Get_or_null(Wdata_itemByTitle_cfg.Key); // Special:ItemByTitle/enwiki/Earth -> www.wikidata.org/wiki/Q2 Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg(); byte[] site_bry = cfg.Site_default(); byte[] page_bry = Bry_.Empty; byte[] raw_bry = ttl.Full_txt_wo_qarg(); // EX: enwiki/Earth - int args_len = calling_url.Args().length; + int args_len = url.Args().length; if (args_len > 0) { - arg_hash.Load(calling_url); + arg_hash.Load(url); site_bry = arg_hash.Get_val_bry_or(Arg_site, Bry_.Empty); page_bry = arg_hash.Get_val_bry_or(Arg_page, Bry_.Empty); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java index 258bf5787..ca2f1be6f 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java @@ -65,7 +65,7 @@ class Wdata_itemByTitle_page_fxt { page.Url_(url); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_ascii_(link)); page.Ttl_(ttl); - special_page.Special_gen(url, page, wiki, ttl); + special_page.Special_gen(wiki, page, url, ttl); Tfds.Eq_str_lines(expd, String_.new_ascii_(page.Data_raw())); } public String Expd_html(String wmf_key, String ttl_str) { diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java index cbdf99f58..75a8d4f0c 100644 --- a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java @@ -35,6 +35,7 @@ public class Xoav_app implements Xoa_app { public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr(); public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();} public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();} + public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_domain(domain) == null;} public Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr; public Xoud_db_mgr User_data_mgr() {return user_data_mgr;} private Xoud_db_mgr user_data_mgr = new Xoud_db_mgr(); diff --git a/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java index 94cc79de5..cf99bfa8c 100644 --- a/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java +++ b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.xowa2.apps.urls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.apps.*; public class Xoav_url_parser { - private static final byte[] Bry_site = Bry_.new_ascii_("/site/"), Bry_wiki = Bry_.new_ascii_("/wiki/"); + private static final byte[] Bry_site = Bry_.new_ascii_("/site/"), Bry_wiki = Bry_.new_ascii_("/wiki/"), Bry_http = Bry_.new_ascii_("http:"); public void Parse_xo_href(Xoav_url rv, byte[] src, byte[] cur_wiki_bry) { rv.Clear(); - int pos = 5; // remove "http:" + int pos = Bry_.HasAtBgn(src, Bry_http) ? Bry_http.length : 0; // DRD: DRD:2.2 adds "http:" to all links int src_len = src.length; if (Bry_.HasAtBgn(src, Bry_site, pos, src_len)) pos = Parse_wiki(rv, src, src_len, pos); diff --git a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java index 913334f2e..d5073f95e 100644 --- a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java +++ b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.xowa2.wikis; import gplx.*; import gplx.xowa2.*; import gplx.core.primitives.*; -import gplx.xowa.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.html.hzips.*; -import gplx.xowa.wikis.data.*; +import gplx.xowa.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.bins.*; -import gplx.xowa.wikis.data.tbls.*; import gplx.dbs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.wikis.*; import gplx.xowa.files.repos.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.files.repos.*; import gplx.xowa.wikis.data.tbls.*; import gplx.dbs.*; +import gplx.xowa.html.wtrs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.html.hzips.*; import gplx.xowa2.apps.*; import gplx.xowa2.wikis.specials.*; import gplx.xowa2.gui.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { @@ -34,6 +34,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { this.ns_mgr = Xow_ns_mgr_.default_(app.Utl_case_mgr()); this.html_mgr__hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), this); this.html_mgr__hdump_rdr = new Xohd_hdump_rdr(app, this); + this.html_mgr__lnki_wtr_utl = new Xoh_lnki_wtr_utl(this, new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Url_ttl(), new Gfo_url_parser())); this.xwiki_mgr = new Xow_xwiki_mgr(); this.special_mgr = new Xosp_special_mgr(this); Io_url wiki_file_dir = domain_tid == Xow_domain_.Tid_int_home ? wiki_root_dir : wiki_root_dir.OwnerDir().OwnerDir().GenSubDir_nest("file", domain_str); @@ -57,6 +58,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { public boolean Html_mgr__hdump_enabled() {return Bool_.Y;} public Xow_hzip_mgr Html_mgr__hzip_mgr() {return html_mgr__hzip_mgr;} private final Xow_hzip_mgr html_mgr__hzip_mgr; public Xohd_hdump_rdr Html_mgr__hdump_rdr() {return html_mgr__hdump_rdr;} private final Xohd_hdump_rdr html_mgr__hdump_rdr; + public Xoh_lnki_wtr_utl Html_mgr__lnki_wtr_utl() {return html_mgr__lnki_wtr_utl;} private final Xoh_lnki_wtr_utl html_mgr__lnki_wtr_utl; public Xol_lang Lang() {throw Err_.not_implemented_();} public Xosp_special_mgr Special_mgr() {return special_mgr;} private Xosp_special_mgr special_mgr; diff --git a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_ui_swt.java b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_ui_swt.java index dd8eaee25..68db4f4ac 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_ui_swt.java +++ b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_ui_swt.java @@ -18,13 +18,12 @@ along with this program. If not, see . package gplx; import gplx.core.strings.*; import gplx.gfui.*; public class Gfo_usr_dlg_ui_swt implements Gfo_usr_dlg_ui, GfoInvkAble { - Gfui_kit kit; GfuiInvkCmd cmd_sync; GfuiTextBox prog_box, info_box, warn_box; + private final GfuiInvkCmd cmd_sync; private final GfuiTextBox prog_box, info_box; private final Gfo_usr_dlg_ui_opt opt; public Gfo_usr_dlg_ui_swt(Gfui_kit kit, GfuiTextBox prog_box, GfuiTextBox info_box, GfuiTextBox warn_box, Gfo_usr_dlg_ui_opt opt) { - this.kit = kit; - cmd_sync = kit.New_cmd_sync(this); // NOTE: cmd_sync needed else progress messages may be sent out of order - this.prog_box = prog_box; this.info_box = info_box; this.warn_box = warn_box; + this.cmd_sync = kit.New_cmd_sync(this); // NOTE: cmd_sync needed else progress messages may be sent out of order + this.prog_box = prog_box; this.info_box = info_box; this.opt = opt; - } Gfo_usr_dlg_ui_opt opt; + } public void Clear() {Write(Invk_write_prog, ""); info_box.Text_(""); info_box.ForeColor_(ColorAdp_.Black); info_box.BackColor_(ColorAdp_.White); info_box.Redraw(); info_box_is_warn = false;} public String_ring Prog_msgs() {return prog_msgs;} String_ring prog_msgs = new String_ring().Max_(128); public void Write_prog(String text) {Write(Invk_write_prog, text);} diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_mgr.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_mgr.java index 1f684c680..3dfba0b7b 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_mgr.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_mgr.java @@ -224,6 +224,14 @@ public class Xow_ns_mgr implements GfoInvkAble, gplx.lists.ComparerAble { private void Ords_sort_add(int ns_id) { this.Add_new(ns_id, Bry_.XbyInt(ns_id), Xow_ns_case_.Id_1st, false); // NOTE: name and case_match are mostly useless defaults; note that in theory this proc should not be called (all siteInfos should be well-formed) but just in case, create items now so that Get_by_ord() does not fail } + public byte[] Bld_ttl_w_ns(Bry_bfr bfr, boolean text_form, boolean literalize, int ns_id, byte[] ttl) { + if (ns_id == Xow_ns_.Id_main) return ttl; + Xow_ns ns = Ids_get_or_null(ns_id); if (ns == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "ns_mgr:uknown ns_id; ns_id=~{0} ttl=~{1}", ns_id, ttl); return ttl;} + if (literalize) bfr.Add_byte(Byte_ascii.Colon); // NOTE: add : to literalize ns; EX: [[Category:A]] will get thrown into category list; [[:Category:A]] will print + bfr.Add(text_form ? ns.Name_txt_w_colon() : ns.Name_db_w_colon()); + bfr.Add(ttl); + return bfr.Xto_bry_and_clear(); + } class Xow_ns_mgr_name_itm { public Xow_ns_mgr_name_itm(byte[] name, Xow_ns ns) {this.name = name; this.name_len = name.length; this.ns = ns;} public byte[] Name() {return name;} private byte[] name; diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index 416d5e58d..c07c6610c 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -17,10 +17,9 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.primitives.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.ttls.*; -import gplx.xowa.wikis.data.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; 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.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; +import gplx.xowa.html.wtrs.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; public interface Xow_wiki extends Xow_ttl_parser { byte[] Domain_bry(); // EX: en.wikipedia.org String Domain_str(); @@ -39,4 +38,5 @@ public interface Xow_wiki extends Xow_ttl_parser { boolean Html_mgr__hdump_enabled(); Xow_hzip_mgr Html_mgr__hzip_mgr(); Xohd_hdump_rdr Html_mgr__hdump_rdr(); + Xoh_lnki_wtr_utl Html_mgr__lnki_wtr_utl(); } diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java index 4d1984122..93c094ded 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java @@ -22,7 +22,7 @@ import gplx.fsdb.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; 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.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.xwikis.*; -import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; +import gplx.xowa.html.wtrs.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.setup.maints.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.tdbs.*; @@ -40,6 +40,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { html_mgr = new Xow_html_mgr(this); this.html_mgr__hdump_rdr = new Xohd_hdump_rdr(app, this); this.html_mgr__hdump_wtr = new Xohd_hdump_wtr(app, this); + this.html_mgr__lnki_wtr_utl = new Xoh_lnki_wtr_utl(this, app.Href_parser()); tdb_fsys_mgr = new Xotdb_fsys_mgr(wiki_dir, ns_mgr); xwiki_domain_tid = Xwiki_tid(domain_tid); @@ -100,6 +101,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { public Xow_hzip_mgr Html_mgr__hzip_mgr() {return html_mgr.Hzip_mgr();} public Xohd_hdump_rdr Html_mgr__hdump_rdr() {return html_mgr__hdump_rdr;} private final Xohd_hdump_rdr html_mgr__hdump_rdr; public Xohd_hdump_wtr Html_mgr__hdump_wtr() {return html_mgr__hdump_wtr;} private final Xohd_hdump_wtr html_mgr__hdump_wtr; + public Xoh_lnki_wtr_utl Html_mgr__lnki_wtr_utl() {return html_mgr__lnki_wtr_utl;} private final Xoh_lnki_wtr_utl html_mgr__lnki_wtr_utl; public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private final Xow_xwiki_mgr xwiki_mgr; public int Xwiki_domain_tid() {return xwiki_domain_tid;} private int xwiki_domain_tid; @@ -162,7 +164,8 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { public Xoae_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xog_tab_itm tab) {return GetPageByTtl(url, ttl, lang, tab, true);} public Xoae_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xol_lang lang, Xog_tab_itm tab, boolean parse_page) { if (init_needed) Init_wiki(app.User()); - Xoae_page page = data_mgr.Get_page(url, ttl, false, false); // get page from data_mgr + Xoae_page page = Xoae_page.new_(this, ttl); page.Tab_data().Tab_(tab); + data_mgr.Get_page(page, url, ttl, false, false); // get page from data_mgr if (page.Missing()) { // page doesn't exist if (ttl.Ns().Id_file()) { Xowe_wiki commons_wiki = app.Wiki_mgr().Get_by_key_or_null(commons_wiki_key); @@ -174,7 +177,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { return page.Missing_(); } if (page.Missing()) return page; // NOTE: commons can return null page - page.Tab_(tab); + page.Tab_data().Tab_(tab); page.Lang_(lang); if (parse_page) ParsePage(page, false); // NOTE: do not clear page b/c reused for search @@ -240,13 +243,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { app.Wiki_mgr().Scripts().Exec(this); Bry_fmtr.Null.Eval_mgr().Enabled_(true); app.Css_installer().Install_assert(Bool_.Y, this, user.Fsys_mgr().Wiki_html_dir(domain_str)); - if (html_mgr__hdump_enabled) { - // if (db_mgr.Tid() == Xodb_mgr_txt.Tid_txt) this.Db_mgr_create_as_sql(); - Xowd_html_tbl.Assert_col__page_html_db_id(Db_mgr_as_sql().Core_data_mgr()); // NOTE: must go above html_mgr.Init_by_wiki b/c Page_load will be done via messages - this.Db_mgr_as_sql().Core_data_mgr().Tbl__page().Hdump_enabled_(html_mgr__hdump_enabled); - html_mgr__hdump_rdr.Init_by_db(this.Data_mgr__core_mgr()); - html_mgr__hdump_wtr.Init_by_db(this.Data_mgr__core_mgr()); - } + Html_mgr__hdump_enabled_(html_mgr__hdump_enabled); html_mgr.Init_by_wiki(this); this.Copy_cfg(app.User().Wiki()); File_repos_assert(app, this); @@ -255,6 +252,15 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { app.Log_wtr().Log_msg_to_session_direct(log_bfr.Xto_str()); init_in_process = false; } + private void Html_mgr__hdump_enabled_(boolean v) { + this.html_mgr__hdump_enabled = v; + if (html_mgr__hdump_enabled) { + // if (db_mgr.Tid() == Xodb_mgr_txt.Tid_txt) this.Db_mgr_create_as_sql(); + Xowd_html_tbl.Assert_col__page_html_db_id(Db_mgr_as_sql().Core_data_mgr()); // NOTE: must go above html_mgr.Init_by_wiki b/c Page_load will be done via messages + html_mgr__hdump_rdr.Init_by_db(this.Data_mgr__core_mgr()); + html_mgr__hdump_wtr.Init_by_db(this.Data_mgr__core_mgr()); + } + } public void Rls() { if (rls_list == null) return; int len = rls_list.Count(); @@ -291,7 +297,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { else if (ctx.Match(k, Invk_maint)) return maint_mgr; else if (ctx.Match(k, Invk_domain)) return domain_str; else if (ctx.Match(k, Invk_xtns)) return xtn_mgr; - else if (ctx.Match(k, Invk_hdump_enabled_)) html_mgr__hdump_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_hdump_enabled_)) this.html_mgr__hdump_enabled = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; } diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java index 23cdf2156..6eff7e424 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java @@ -28,11 +28,15 @@ public class Xow_data_mgr implements GfoInvkAble { public Xoae_page Get_page(Xoa_ttl ttl, boolean called_from_tmpl) {wiki.Appe().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, called_from_tmpl, false);} public Xoae_page Get_page_from_msg(Xoa_ttl ttl) {wiki.Appe().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, false, true);} public Xoae_page Get_page(Xoa_url url, Xoa_ttl ttl, boolean called_from_tmpl, boolean called_from_msg) { + Xoae_page rv = Xoae_page.new_(wiki, ttl); + return Get_page(rv, url, ttl, called_from_tmpl, called_from_msg); + } + public Xoae_page Get_page(Xoae_page rv, Xoa_url url, Xoa_ttl ttl, boolean called_from_tmpl, boolean called_from_msg) { + rv.Url_(url); // NOTE: must update page.Url(); should combine with Xoae_page.new_() Xow_ns ns = ttl.Ns(); - Xoae_page rv = Xoae_page.new_(wiki, ttl); rv.Url_(url); // NOTE: must update page.Url(); should combine with Xoae_page.new_() switch (ns.Id()) { case Xow_ns_.Id_special: - wiki.Special_mgr().Special_gen(url, rv, wiki, ttl); + wiki.Special_mgr().Special_gen(wiki, rv, url, ttl); return rv; case Xow_ns_.Id_mediawiki: if ( !called_from_msg // if called from msg, fall through to actual data retrieval below, else infinite loop; DATE:2014-05-09 diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java index b86a2455d..280eb8981 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java @@ -63,7 +63,7 @@ public class Xof_xfer_queue { } private void Exec_v2(byte exec_tid, Gfo_usr_dlg wtr, Xowe_wiki wiki, Xoae_page page) { wiki.File_mgr().Init_file_mgr_by_load(wiki); - wiki.File_mgr().Fsdb_mgr().Fsdb_search_by_list(exec_tid, Xfer_itms_to_fsdb_itms(wiki, xfer_list, wiki.File_mgr().Patch_upright()), page, page.Tab().Html_itm()); + wiki.File_mgr().Fsdb_mgr().Fsdb_search_by_list(exec_tid, Xfer_itms_to_fsdb_itms(wiki, xfer_list, wiki.File_mgr().Patch_upright()), page, page.Tab_data().Tab().Html_itm()); } private ListAdp Xfer_itms_to_fsdb_itms(Xowe_wiki wiki, ListAdp xfer_list, int upright_patch) { ListAdp rv = ListAdp_.new_(); @@ -77,8 +77,10 @@ public class Xof_xfer_queue { fsdb.Ctor_by_orig(xfer.Orig_repo_id(), xfer.Orig_repo_name(), xfer.Orig_ttl(), xfer.Orig_ext(), xfer.Orig_w(), xfer.Orig_h(), xfer.Orig_redirect()); else { // NOTE: orig_ext doesn't exist; try to get again, b/c Xof_file_wkr won't get it; DATE:2015-04-05 Xof_orig_itm orig = wiki.File_mgr().Orig_mgr().Find_by_ttl_or_null(xfer.Lnki_ttl()); - gplx.xowa.files.repos.Xof_repo_pair repo_pair = wiki.File_mgr__repo_mgr().Repos_get_by_id(orig.Repo()); - fsdb.Ctor_by_orig(orig.Repo(), repo_pair.Trg().Wiki_key(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + if (orig != null) {; // no orig; + gplx.xowa.files.repos.Xof_repo_pair repo_pair = wiki.File_mgr__repo_mgr().Repos_get_by_id(orig.Repo()); + fsdb.Ctor_by_orig(orig.Repo(), repo_pair.Trg().Wiki_key(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + } } fsdb.Html_uid_(xfer.Html_uid()); fsdb.Html_elem_tid_(xfer.Html_elem_tid()); diff --git a/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java b/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java index 923d2b472..2034b909c 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java @@ -79,7 +79,7 @@ public class Xoa_css_extractor { if ( core_db_mgr == null || core_db_mgr.Props() == null || core_db_mgr.Props().Schema_is_1() - || !core_db_mgr.Tbl__cfg().Select_yn_or(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__tbl_css_core, Bool_.N) + || !core_db_mgr.Tbl__cfg().Select_yn_or(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__tbl_css_core, Bool_.N) ) return false; Xowd_db_file core_db = core_db_mgr.Db__core(); gplx.xowa.html.css.Xowd_css_core_mgr.Get(core_db.Tbl__css_core(), core_db.Tbl__css_file(), wiki_html_dir); diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java index ffda24dcf..88fa68588 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java @@ -63,7 +63,7 @@ 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.Xosrh_core.Version_2) + 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); bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_term); } diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java index 9dea2c680..3ba24f0ce 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java @@ -124,836 +124,4 @@ public class Xoi_cmd_wiki_tst { bfr.Add_str("app.bldr.wiki_cfg_bldr.run;").Add_byte_nl(); Io_mgr._.SaveFilStr("C:\\xowa_build_cfg.gfs", bfr.Xto_str()); } - public static String[] Wikis = new String[] -//{ "simple.wikipedia.org" -//}; -{ "commons.wikimedia.org" -, "species.wikimedia.org" -, "meta.wikimedia.org" -, "incubator.wikimedia.org" -, "www.wikidata.org" -, "www.mediawiki.org" -, "wikimediafoundation.org" -, "en.wikipedia.org" -, "en.wiktionary.org" -, "en.wikisource.org" -, "en.wikibooks.org" -, "en.wikiversity.org" -, "en.wikiquote.org" -, "en.wikinews.org" -, "en.wikivoyage.org" -, "de.wikipedia.org" -, "de.wiktionary.org" -, "de.wikisource.org" -, "de.wikibooks.org" -, "de.wikiversity.org" -, "de.wikiquote.org" -, "de.wikinews.org" -, "de.wikivoyage.org" -, "es.wikipedia.org" -, "es.wiktionary.org" -, "es.wikisource.org" -, "es.wikibooks.org" -, "es.wikiversity.org" -, "es.wikiquote.org" -, "es.wikinews.org" -, "es.wikivoyage.org" -, "fr.wikipedia.org" -, "fr.wiktionary.org" -, "fr.wikisource.org" -, "fr.wikibooks.org" -, "fr.wikiversity.org" -, "fr.wikiquote.org" -, "fr.wikinews.org" -, "fr.wikivoyage.org" -, "it.wikipedia.org" -, "it.wiktionary.org" -, "it.wikisource.org" -, "it.wikibooks.org" -, "it.wikiversity.org" -, "it.wikiquote.org" -, "it.wikinews.org" -, "it.wikivoyage.org" -, "ja.wikipedia.org" -, "ja.wiktionary.org" -, "ja.wikisource.org" -, "ja.wikibooks.org" -, "ja.wikiversity.org" -, "ja.wikiquote.org" -, "ja.wikinews.org" -, "nl.wikipedia.org" -, "nl.wiktionary.org" -, "nl.wikisource.org" -, "nl.wikibooks.org" -, "nl.wikiquote.org" -, "nl.wikinews.org" -, "nl.wikivoyage.org" -, "nl.wikimedia.org" -, "pl.wikipedia.org" -, "pl.wiktionary.org" -, "pl.wikisource.org" -, "pl.wikibooks.org" -, "pl.wikiquote.org" -, "pl.wikinews.org" -, "pl.wikivoyage.org" -, "pl.wikimedia.org" -, "pt.wikipedia.org" -, "pt.wiktionary.org" -, "pt.wikisource.org" -, "pt.wikibooks.org" -, "pt.wikiversity.org" -, "pt.wikiquote.org" -, "pt.wikinews.org" -, "pt.wikivoyage.org" -, "ru.wikipedia.org" -, "ru.wiktionary.org" -, "ru.wikisource.org" -, "ru.wikibooks.org" -, "ru.wikiversity.org" -, "ru.wikiquote.org" -, "ru.wikinews.org" -, "ru.wikivoyage.org" -, "ru.wikimedia.org" -, "ar.wikipedia.org" -, "ar.wiktionary.org" -, "ar.wikisource.org" -, "ar.wikibooks.org" -, "ar.wikiversity.org" -, "ar.wikiquote.org" -, "ar.wikinews.org" -, "ar.wikimedia.org" -, "ca.wikipedia.org" -, "ca.wiktionary.org" -, "ca.wikisource.org" -, "ca.wikibooks.org" -, "ca.wikiquote.org" -, "ca.wikinews.org" -, "ca.wikimedia.org" -, "cs.wikipedia.org" -, "cs.wiktionary.org" -, "cs.wikisource.org" -, "cs.wikibooks.org" -, "cs.wikiversity.org" -, "cs.wikiquote.org" -, "cs.wikinews.org" -, "da.wikipedia.org" -, "da.wiktionary.org" -, "da.wikisource.org" -, "da.wikibooks.org" -, "da.wikiquote.org" -, "eo.wikipedia.org" -, "eo.wiktionary.org" -, "eo.wikisource.org" -, "eo.wikibooks.org" -, "eo.wikiquote.org" -, "eo.wikinews.org" -, "fa.wikipedia.org" -, "fa.wiktionary.org" -, "fa.wikisource.org" -, "fa.wikibooks.org" -, "fa.wikiquote.org" -, "fa.wikinews.org" -, "fa.wikivoyage.org" -, "fi.wikipedia.org" -, "fi.wiktionary.org" -, "fi.wikisource.org" -, "fi.wikibooks.org" -, "fi.wikiversity.org" -, "fi.wikiquote.org" -, "fi.wikinews.org" -, "fi.wikimedia.org" -, "hu.wikipedia.org" -, "hu.wiktionary.org" -, "hu.wikisource.org" -, "hu.wikibooks.org" -, "hu.wikiquote.org" -, "hu.wikinews.org" -, "id.wikipedia.org" -, "id.wiktionary.org" -, "id.wikisource.org" -, "id.wikibooks.org" -, "id.wikiquote.org" -, "kk.wikipedia.org" -, "kk.wiktionary.org" -, "kk.wikibooks.org" -, "kk.wikiquote.org" -, "ko.wikipedia.org" -, "ko.wiktionary.org" -, "ko.wikisource.org" -, "ko.wikibooks.org" -, "ko.wikiversity.org" -, "ko.wikiquote.org" -, "ko.wikinews.org" -, "lt.wikipedia.org" -, "lt.wiktionary.org" -, "lt.wikisource.org" -, "lt.wikibooks.org" -, "lt.wikiquote.org" -, "no.wikipedia.org" -, "no.wiktionary.org" -, "no.wikisource.org" -, "no.wikibooks.org" -, "no.wikiquote.org" -, "no.wikinews.org" -, "no.wikimedia.org" -, "ro.wikipedia.org" -, "ro.wiktionary.org" -, "ro.wikisource.org" -, "ro.wikibooks.org" -, "ro.wikiquote.org" -, "ro.wikinews.org" -, "ro.wikivoyage.org" -, "sk.wikipedia.org" -, "sk.wiktionary.org" -, "sk.wikisource.org" -, "sk.wikibooks.org" -, "sk.wikiquote.org" -, "sr.wikipedia.org" -, "sr.wiktionary.org" -, "sr.wikisource.org" -, "sr.wikibooks.org" -, "sr.wikiquote.org" -, "sr.wikinews.org" -, "sv.wikipedia.org" -, "sv.wiktionary.org" -, "sv.wikisource.org" -, "sv.wikibooks.org" -, "sv.wikiversity.org" -, "sv.wikiquote.org" -, "sv.wikinews.org" -, "sv.wikivoyage.org" -, "tr.wikipedia.org" -, "tr.wiktionary.org" -, "tr.wikisource.org" -, "tr.wikibooks.org" -, "tr.wikiquote.org" -, "tr.wikinews.org" -, "tr.wikimedia.org" -, "uk.wikipedia.org" -, "uk.wiktionary.org" -, "uk.wikisource.org" -, "uk.wikibooks.org" -, "uk.wikiquote.org" -, "uk.wikinews.org" -, "uk.wikivoyage.org" -, "uk.wikimedia.org" -, "vi.wikipedia.org" -, "vi.wiktionary.org" -, "vi.wikisource.org" -, "vi.wikibooks.org" -, "vi.wikiquote.org" -, "vi.wikivoyage.org" -, "zh.wikipedia.org" -, "zh.wiktionary.org" -, "zh.wikisource.org" -, "zh.wikibooks.org" -, "zh.wikiquote.org" -, "zh.wikinews.org" -, "zh.wikivoyage.org" -, "bg.wikipedia.org" -, "bg.wiktionary.org" -, "bg.wikisource.org" -, "bg.wikibooks.org" -, "bg.wikiquote.org" -, "bg.wikinews.org" -, "el.wikipedia.org" -, "el.wiktionary.org" -, "el.wikisource.org" -, "el.wikibooks.org" -, "el.wikiversity.org" -, "el.wikiquote.org" -, "el.wikinews.org" -, "el.wikivoyage.org" -, "et.wikipedia.org" -, "et.wiktionary.org" -, "et.wikisource.org" -, "et.wikibooks.org" -, "et.wikiquote.org" -, "et.wikimedia.org" -, "eu.wikipedia.org" -, "eu.wiktionary.org" -, "eu.wikibooks.org" -, "eu.wikiquote.org" -, "gl.wikipedia.org" -, "gl.wiktionary.org" -, "gl.wikisource.org" -, "gl.wikibooks.org" -, "gl.wikiquote.org" -, "he.wikipedia.org" -, "he.wiktionary.org" -, "he.wikisource.org" -, "he.wikibooks.org" -, "he.wikiquote.org" -, "he.wikinews.org" -, "he.wikivoyage.org" -, "hr.wikipedia.org" -, "hr.wiktionary.org" -, "hr.wikisource.org" -, "hr.wikibooks.org" -, "hr.wikiquote.org" -, "ms.wikipedia.org" -, "ms.wiktionary.org" -, "ms.wikibooks.org" -, "nn.wikipedia.org" -, "nn.wiktionary.org" -, "nn.wikiquote.org" -, "sh.wikipedia.org" -, "sh.wiktionary.org" -, "simple.wikipedia.org" -, "simple.wiktionary.org" -, "simple.wikibooks.org" -, "simple.wikiquote.org" -, "sl.wikipedia.org" -, "sl.wiktionary.org" -, "sl.wikisource.org" -, "sl.wikibooks.org" -, "sl.wikiversity.org" -, "sl.wikiquote.org" -, "th.wikipedia.org" -, "th.wiktionary.org" -, "th.wikisource.org" -, "th.wikibooks.org" -, "th.wikiquote.org" -, "th.wikinews.org" -, "vo.wikipedia.org" -, "vo.wiktionary.org" -, "vo.wikibooks.org" -, "vo.wikiquote.org" -, "hi.wikipedia.org" -, "hi.wiktionary.org" -, "hi.wikibooks.org" -, "hi.wikiquote.org" -, "ia.wikipedia.org" -, "ia.wiktionary.org" -, "ia.wikibooks.org" -, "la.wikipedia.org" -, "la.wiktionary.org" -, "la.wikisource.org" -, "la.wikibooks.org" -, "la.wikiquote.org" -, "aa.wikipedia.org" -, "aa.wiktionary.org" -, "aa.wikibooks.org" -, "ab.wikipedia.org" -, "ab.wiktionary.org" -, "ace.wikipedia.org" -, "af.wikipedia.org" -, "af.wiktionary.org" -, "af.wikibooks.org" -, "af.wikiquote.org" -, "ak.wikipedia.org" -, "ak.wiktionary.org" -, "ak.wikibooks.org" -, "als.wikipedia.org" -, "als.wiktionary.org" -, "als.wikibooks.org" -, "als.wikiquote.org" -, "am.wikipedia.org" -, "am.wiktionary.org" -, "am.wikiquote.org" -, "an.wikipedia.org" -, "an.wiktionary.org" -, "ang.wikipedia.org" -, "ang.wiktionary.org" -, "ang.wikisource.org" -, "ang.wikibooks.org" -, "ang.wikiquote.org" -, "arc.wikipedia.org" -, "arz.wikipedia.org" -, "as.wikipedia.org" -, "as.wiktionary.org" -, "as.wikisource.org" -, "as.wikibooks.org" -, "ast.wikipedia.org" -, "ast.wiktionary.org" -, "ast.wikibooks.org" -, "ast.wikiquote.org" -, "av.wikipedia.org" -, "av.wiktionary.org" -, "ay.wikipedia.org" -, "ay.wiktionary.org" -, "ay.wikibooks.org" -, "az.wikipedia.org" -, "az.wiktionary.org" -, "az.wikisource.org" -, "az.wikibooks.org" -, "az.wikiquote.org" -, "ba.wikipedia.org" -, "ba.wikibooks.org" -, "bar.wikipedia.org" -, "bat-smg.wikipedia.org" -, "bcl.wikipedia.org" -, "be.wikipedia.org" -, "be.wiktionary.org" -, "be.wikisource.org" -, "be.wikibooks.org" -, "be.wikiquote.org" -, "be.wikimedia.org" -, "be-x-old.wikipedia.org" -, "bh.wikipedia.org" -, "bh.wiktionary.org" -, "bi.wikipedia.org" -, "bi.wiktionary.org" -, "bi.wikibooks.org" -, "bjn.wikipedia.org" -, "bm.wikipedia.org" -, "bm.wiktionary.org" -, "bm.wikibooks.org" -, "bm.wikiquote.org" -, "bn.wikipedia.org" -, "bn.wiktionary.org" -, "bn.wikisource.org" -, "bn.wikibooks.org" -, "bo.wikipedia.org" -, "bo.wiktionary.org" -, "bo.wikibooks.org" -, "bpy.wikipedia.org" -, "br.wikipedia.org" -, "br.wiktionary.org" -, "br.wikisource.org" -, "br.wikiquote.org" -, "br.wikimedia.org" -, "bs.wikipedia.org" -, "bs.wiktionary.org" -, "bs.wikisource.org" -, "bs.wikibooks.org" -, "bs.wikiquote.org" -, "bs.wikinews.org" -, "bug.wikipedia.org" -, "bxr.wikipedia.org" -, "cbk-zam.wikipedia.org" -, "cdo.wikipedia.org" -, "ce.wikipedia.org" -, "ceb.wikipedia.org" -, "ch.wikipedia.org" -, "ch.wiktionary.org" -, "ch.wikibooks.org" -, "cho.wikipedia.org" -, "chr.wikipedia.org" -, "chr.wiktionary.org" -, "chy.wikipedia.org" -, "ckb.wikipedia.org" -, "co.wikipedia.org" -, "co.wiktionary.org" -, "co.wikibooks.org" -, "co.wikiquote.org" -, "co.wikimedia.org" -, "cr.wikipedia.org" -, "cr.wiktionary.org" -, "cr.wikiquote.org" -, "crh.wikipedia.org" -, "csb.wikipedia.org" -, "csb.wiktionary.org" -, "cu.wikipedia.org" -, "cv.wikipedia.org" -, "cv.wikibooks.org" -, "cy.wikipedia.org" -, "cy.wiktionary.org" -, "cy.wikisource.org" -, "cy.wikibooks.org" -, "cy.wikiquote.org" -, "diq.wikipedia.org" -, "dsb.wikipedia.org" -, "dv.wikipedia.org" -, "dv.wiktionary.org" -, "dz.wikipedia.org" -, "dz.wiktionary.org" -, "ee.wikipedia.org" -, "eml.wikipedia.org" -, "ext.wikipedia.org" -, "ff.wikipedia.org" -, "fiu-vro.wikipedia.org" -, "fj.wikipedia.org" -, "fj.wiktionary.org" -, "fo.wikipedia.org" -, "fo.wiktionary.org" -, "fo.wikisource.org" -, "frp.wikipedia.org" -, "frr.wikipedia.org" -, "fur.wikipedia.org" -, "fy.wikipedia.org" -, "fy.wiktionary.org" -, "fy.wikibooks.org" -, "ga.wikipedia.org" -, "ga.wiktionary.org" -, "ga.wikibooks.org" -, "ga.wikiquote.org" -, "gag.wikipedia.org" -, "gan.wikipedia.org" -, "gd.wikipedia.org" -, "gd.wiktionary.org" -, "glk.wikipedia.org" -, "gn.wikipedia.org" -, "gn.wiktionary.org" -, "gn.wikibooks.org" -, "got.wikipedia.org" -, "got.wikibooks.org" -, "gu.wikipedia.org" -, "gu.wiktionary.org" -, "gu.wikisource.org" -, "gu.wikibooks.org" -, "gu.wikiquote.org" -, "gv.wikipedia.org" -, "gv.wiktionary.org" -, "ha.wikipedia.org" -, "ha.wiktionary.org" -, "hak.wikipedia.org" -, "haw.wikipedia.org" -, "hif.wikipedia.org" -, "ho.wikipedia.org" -, "hsb.wikipedia.org" -, "hsb.wiktionary.org" -, "ht.wikipedia.org" -, "ht.wikisource.org" -, "hy.wikipedia.org" -, "hy.wiktionary.org" -, "hy.wikisource.org" -, "hy.wikibooks.org" -, "hy.wikiquote.org" -, "hz.wikipedia.org" -, "ie.wikipedia.org" -, "ie.wiktionary.org" -, "ie.wikibooks.org" -, "ig.wikipedia.org" -, "ii.wikipedia.org" -, "ik.wikipedia.org" -, "ik.wiktionary.org" -, "ilo.wikipedia.org" -, "io.wikipedia.org" -, "io.wiktionary.org" -, "is.wikipedia.org" -, "is.wiktionary.org" -, "is.wikisource.org" -, "is.wikibooks.org" -, "is.wikiquote.org" -, "iu.wikipedia.org" -, "iu.wiktionary.org" -, "jbo.wikipedia.org" -, "jbo.wiktionary.org" -, "jv.wikipedia.org" -, "jv.wiktionary.org" -, "ka.wikipedia.org" -, "ka.wiktionary.org" -, "ka.wikibooks.org" -, "ka.wikiquote.org" -, "kaa.wikipedia.org" -, "kab.wikipedia.org" -, "kbd.wikipedia.org" -, "kg.wikipedia.org" -, "ki.wikipedia.org" -, "kj.wikipedia.org" -, "kl.wikipedia.org" -, "kl.wiktionary.org" -, "km.wikipedia.org" -, "km.wiktionary.org" -, "km.wikibooks.org" -, "kn.wikipedia.org" -, "kn.wiktionary.org" -, "kn.wikisource.org" -, "kn.wikibooks.org" -, "kn.wikiquote.org" -, "koi.wikipedia.org" -, "kr.wikipedia.org" -, "kr.wikiquote.org" -, "krc.wikipedia.org" -, "ks.wikipedia.org" -, "ks.wiktionary.org" -, "ks.wikibooks.org" -, "ks.wikiquote.org" -, "ksh.wikipedia.org" -, "ku.wikipedia.org" -, "ku.wiktionary.org" -, "ku.wikibooks.org" -, "ku.wikiquote.org" -, "kv.wikipedia.org" -, "kw.wikipedia.org" -, "kw.wiktionary.org" -, "kw.wikiquote.org" -, "ky.wikipedia.org" -, "ky.wiktionary.org" -, "ky.wikibooks.org" -, "ky.wikiquote.org" -, "lad.wikipedia.org" -, "lb.wikipedia.org" -, "lb.wiktionary.org" -, "lb.wikibooks.org" -, "lb.wikiquote.org" -, "lbe.wikipedia.org" -, "lez.wikipedia.org" -, "lg.wikipedia.org" -, "li.wikipedia.org" -, "li.wiktionary.org" -, "li.wikisource.org" -, "li.wikibooks.org" -, "li.wikiquote.org" -, "lij.wikipedia.org" -, "lmo.wikipedia.org" -, "ln.wikipedia.org" -, "ln.wiktionary.org" -, "ln.wikibooks.org" -, "lo.wikipedia.org" -, "lo.wiktionary.org" -, "ltg.wikipedia.org" -, "lv.wikipedia.org" -, "lv.wiktionary.org" -, "lv.wikibooks.org" -, "mai.wikipedia.org" -, "map-bms.wikipedia.org" -, "mdf.wikipedia.org" -, "mg.wikipedia.org" -, "mg.wiktionary.org" -, "mg.wikibooks.org" -, "mh.wikipedia.org" -, "mh.wiktionary.org" -, "mhr.wikipedia.org" -, "mi.wikipedia.org" -, "mi.wiktionary.org" -, "mi.wikibooks.org" -, "min.wikipedia.org" -, "mk.wikipedia.org" -, "mk.wiktionary.org" -, "mk.wikisource.org" -, "mk.wikibooks.org" -, "mk.wikimedia.org" -, "ml.wikipedia.org" -, "ml.wiktionary.org" -, "ml.wikisource.org" -, "ml.wikibooks.org" -, "ml.wikiquote.org" -, "mn.wikipedia.org" -, "mn.wiktionary.org" -, "mn.wikibooks.org" -, "mo.wikipedia.org" -, "mo.wiktionary.org" -, "mr.wikipedia.org" -, "mr.wiktionary.org" -, "mr.wikisource.org" -, "mr.wikibooks.org" -, "mr.wikiquote.org" -, "mrj.wikipedia.org" -, "mt.wikipedia.org" -, "mt.wiktionary.org" -, "mus.wikipedia.org" -, "mwl.wikipedia.org" -, "my.wikipedia.org" -, "my.wiktionary.org" -, "my.wikibooks.org" -, "myv.wikipedia.org" -, "mzn.wikipedia.org" -, "na.wikipedia.org" -, "na.wiktionary.org" -, "na.wikibooks.org" -, "na.wikiquote.org" -, "nah.wikipedia.org" -, "nah.wiktionary.org" -, "nah.wikibooks.org" -, "nap.wikipedia.org" -, "nds.wikipedia.org" -, "nds.wiktionary.org" -, "nds.wikibooks.org" -, "nds.wikiquote.org" -, "nds-nl.wikipedia.org" -, "ne.wikipedia.org" -, "ne.wiktionary.org" -, "ne.wikibooks.org" -, "new.wikipedia.org" -, "ng.wikipedia.org" -, "nov.wikipedia.org" -, "nrm.wikipedia.org" -, "nso.wikipedia.org" -, "nv.wikipedia.org" -, "ny.wikipedia.org" -, "oc.wikipedia.org" -, "oc.wiktionary.org" -, "oc.wikibooks.org" -, "om.wikipedia.org" -, "om.wiktionary.org" -, "or.wikipedia.org" -, "or.wiktionary.org" -, "or.wikisource.org" -, "os.wikipedia.org" -, "pa.wikipedia.org" -, "pa.wiktionary.org" -, "pa.wikibooks.org" -, "pag.wikipedia.org" -, "pam.wikipedia.org" -, "pap.wikipedia.org" -, "pcd.wikipedia.org" -, "pdc.wikipedia.org" -, "pfl.wikipedia.org" -, "pi.wikipedia.org" -, "pi.wiktionary.org" -, "pih.wikipedia.org" -, "pms.wikipedia.org" -, "pnb.wikipedia.org" -, "pnb.wiktionary.org" -, "pnt.wikipedia.org" -, "ps.wikipedia.org" -, "ps.wiktionary.org" -, "ps.wikibooks.org" -, "qu.wikipedia.org" -, "qu.wiktionary.org" -, "qu.wikibooks.org" -, "qu.wikiquote.org" -, "rm.wikipedia.org" -, "rm.wiktionary.org" -, "rm.wikibooks.org" -, "rmy.wikipedia.org" -, "rn.wikipedia.org" -, "rn.wiktionary.org" -, "roa-rup.wikipedia.org" -, "roa-rup.wiktionary.org" -, "roa-tara.wikipedia.org" -, "rue.wikipedia.org" -, "rw.wikipedia.org" -, "rw.wiktionary.org" -, "sa.wikipedia.org" -, "sa.wiktionary.org" -, "sa.wikisource.org" -, "sa.wikibooks.org" -, "sa.wikiquote.org" -, "sah.wikipedia.org" -, "sah.wikisource.org" -, "sc.wikipedia.org" -, "sc.wiktionary.org" -, "scn.wikipedia.org" -, "scn.wiktionary.org" -, "sco.wikipedia.org" -, "sd.wikipedia.org" -, "sd.wiktionary.org" -, "sd.wikinews.org" -, "se.wikipedia.org" -, "se.wikibooks.org" -, "se.wikimedia.org" -, "sg.wikipedia.org" -, "sg.wiktionary.org" -, "si.wikipedia.org" -, "si.wiktionary.org" -, "si.wikibooks.org" -, "sm.wikipedia.org" -, "sm.wiktionary.org" -, "sn.wikipedia.org" -, "sn.wiktionary.org" -, "so.wikipedia.org" -, "so.wiktionary.org" -, "sq.wikipedia.org" -, "sq.wiktionary.org" -, "sq.wikibooks.org" -, "sq.wikiquote.org" -, "sq.wikinews.org" -, "srn.wikipedia.org" -, "ss.wikipedia.org" -, "ss.wiktionary.org" -, "st.wikipedia.org" -, "st.wiktionary.org" -, "stq.wikipedia.org" -, "su.wikipedia.org" -, "su.wiktionary.org" -, "su.wikibooks.org" -, "su.wikiquote.org" -, "sw.wikipedia.org" -, "sw.wiktionary.org" -, "sw.wikibooks.org" -, "szl.wikipedia.org" -, "ta.wikipedia.org" -, "ta.wiktionary.org" -, "ta.wikisource.org" -, "ta.wikibooks.org" -, "ta.wikiquote.org" -, "ta.wikinews.org" -, "te.wikipedia.org" -, "te.wiktionary.org" -, "te.wikisource.org" -, "te.wikibooks.org" -, "te.wikiquote.org" -, "tet.wikipedia.org" -, "tg.wikipedia.org" -, "tg.wiktionary.org" -, "tg.wikibooks.org" -, "ti.wikipedia.org" -, "ti.wiktionary.org" -, "tk.wikipedia.org" -, "tk.wiktionary.org" -, "tk.wikibooks.org" -, "tk.wikiquote.org" -, "tl.wikipedia.org" -, "tl.wiktionary.org" -, "tl.wikibooks.org" -, "tn.wikipedia.org" -, "tn.wiktionary.org" -, "to.wikipedia.org" -, "to.wiktionary.org" -, "tpi.wikipedia.org" -, "tpi.wiktionary.org" -, "ts.wikipedia.org" -, "ts.wiktionary.org" -, "tt.wikipedia.org" -, "tt.wiktionary.org" -, "tt.wikibooks.org" -, "tt.wikiquote.org" -, "tum.wikipedia.org" -, "tw.wikipedia.org" -, "tw.wiktionary.org" -, "ty.wikipedia.org" -, "tyv.wikipedia.org" -, "udm.wikipedia.org" -, "ug.wikipedia.org" -, "ug.wiktionary.org" -, "ug.wikibooks.org" -, "ug.wikiquote.org" -, "ur.wikipedia.org" -, "ur.wiktionary.org" -, "ur.wikibooks.org" -, "ur.wikiquote.org" -, "uz.wikipedia.org" -, "uz.wiktionary.org" -, "uz.wikibooks.org" -, "uz.wikiquote.org" -, "ve.wikipedia.org" -, "ve.wikimedia.org" -, "vec.wikipedia.org" -, "vec.wiktionary.org" -, "vec.wikisource.org" -, "vep.wikipedia.org" -, "vls.wikipedia.org" -, "wa.wikipedia.org" -, "wa.wiktionary.org" -, "wa.wikibooks.org" -, "war.wikipedia.org" -, "wo.wikipedia.org" -, "wo.wiktionary.org" -, "wo.wikiquote.org" -, "wuu.wikipedia.org" -, "xal.wikipedia.org" -, "xh.wikipedia.org" -, "xh.wiktionary.org" -, "xh.wikibooks.org" -, "xmf.wikipedia.org" -, "yi.wikipedia.org" -, "yi.wiktionary.org" -, "yi.wikisource.org" -, "yo.wikipedia.org" -, "yo.wiktionary.org" -, "yo.wikibooks.org" -, "za.wikipedia.org" -, "za.wiktionary.org" -, "za.wikibooks.org" -, "za.wikiquote.org" -, "zea.wikipedia.org" -, "zh-classical.wikipedia.org" -, "zh-min-nan.wikipedia.org" -, "zh-min-nan.wiktionary.org" -, "zh-min-nan.wikisource.org" -, "zh-min-nan.wikibooks.org" -, "zh-min-nan.wikiquote.org" -, "zh-yue.wikipedia.org" -, "zu.wikipedia.org" -, "zu.wiktionary.org" -, "zu.wikibooks.org" -}; } -//, "als.wikisource.org" -//, "als.wikinews.org" -//, "nds.wikinews.org" -//, "ba.wiktionary.org" -//, "tokipona.wikibooks.org" diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java b/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java index b5834fa00..8df786116 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java @@ -30,7 +30,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.Xosrh_core.Version_2; + public byte Search_version() {return search_version;} private byte search_version = gplx.xowa.specials.search.Xows_page__search.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); diff --git a/400_xowa/src_300_html/gplx/xowa/Xoae_page.java b/400_xowa/src_300_html/gplx/xowa/Xoae_page.java index 47130b869..ca27d0c82 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoae_page.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoae_page.java @@ -30,7 +30,7 @@ public class Xoae_page implements Xoa_page { public Xow_wiki Wiki() {return wiki;} public Xoa_ttl Ttl() {return ttl;} public Xoae_page Ttl_(Xoa_ttl v) {ttl = v; url.Wiki_bry_(wiki.Domain_bry()).Page_bry_(v.Full_url()); return this;} private Xoa_ttl ttl; public Xoa_url Url() {return url;} public Xoae_page Url_(Xoa_url v) {url = v; return this;} private Xoa_url url = Xoa_url.blank_(); - public void Xtn_gallery_packed_exists_y_() {html_data.Xtn_imap_exists_y_();} + public void Xtn_gallery_packed_exists_y_() {html_data.Xtn_gallery_packed_exists_y_();} public boolean Exists() {return !Missing();} public Xopg_revision_data Revision_data() {return revision_data;} private Xopg_revision_data revision_data = new Xopg_revision_data(); @@ -38,7 +38,7 @@ public class Xoae_page implements Xoa_page { public Xopg_redlink_lnki_list Redlink_lnki_list() {return redlink_lnki_list;} private Xopg_redlink_lnki_list redlink_lnki_list; public Xol_lang Lang() {return lang;} public Xoae_page Lang_(Xol_lang v) {lang = v; return this;} private Xol_lang lang; public Xopg_html_data Html_data() {return html_data;} private Xopg_html_data html_data = new Xopg_html_data(); - public Xog_tab_itm Tab() {return tab;} public void Tab_(Xog_tab_itm v) {tab = v;} private Xog_tab_itm tab; + public Xopg_tab_data Tab_data() {return tab_data;} private final Xopg_tab_data tab_data = new Xopg_tab_data(); public Xopg_hdump_data Hdump_data() {return hdump_data;} private final Xopg_hdump_data hdump_data = new Xopg_hdump_data(); public boolean Missing() {return missing;} public Xoae_page Missing_() {return Missing_(true);} public Xoae_page Missing_(boolean v) {missing = v; return this;} private boolean missing; public boolean Redirected() {return redirected;} public Xoae_page Redirected_(boolean v) {redirected = v; return this;} private boolean redirected; @@ -89,6 +89,7 @@ public class Xoae_page implements Xoa_page { slink_list.Clear(); html_data.Clear(); lnki_file_mgr.Clear(); + tab_data.Clear(); pages_recursed = false; tmpl_stack_ary = Bry_.Ary_empty; tmpl_stack_ary_len = tmpl_stack_ary_max = 0; diff --git a/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java b/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java index b87b8f55b..11a60853c 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java +++ b/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java @@ -29,7 +29,7 @@ public class Xop_link_parser { case Xoo_protocol_itm.Tid_http: case Xoo_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 (Bry_.Eq(wiki_bry, wiki.Domain_bry()) // link is to this wiki; check if alias - || app.Xwiki_exists(wiki_bry)) { // link is to an xwiki + || app.Xwiki_mgr__exists(wiki_bry)) { // link is to an xwiki page_bry = tmp_url.Page_for_lnki(); Parse__ttl(tmp_bfr, wiki, wiki_bry, page_bry); } diff --git a/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser.java b/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser.java index 44be7ecfa..41e2be900 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser.java @@ -72,10 +72,10 @@ public class Xoh_href_parser { } } } - public byte[] Build_to_bry(Xowe_wiki wiki, Xoa_ttl ttl) {Build_to_bfr(tmp_bfr, wiki, ttl, Bool_.N); return tmp_bfr.Xto_bry_and_clear();} - public void Build_to_bfr(Bry_bfr bfr, Xowe_wiki wiki, byte[] raw) {Build_to_bfr(bfr, wiki, Xoa_ttl.parse_(wiki, raw), Bool_.N);} - public void Build_to_bfr(Bry_bfr bfr, Xowe_wiki wiki, Xoa_ttl ttl) {Build_to_bfr(bfr, wiki, ttl, Bool_.N);} - public void Build_to_bfr(Bry_bfr bfr, Xowe_wiki wiki, Xoa_ttl ttl, boolean force_site) { + public byte[] Build_to_bry(Xow_wiki wiki, Xoa_ttl ttl) {Build_to_bfr(tmp_bfr, wiki, ttl, Bool_.N); return tmp_bfr.Xto_bry_and_clear();} + public void Build_to_bfr(Bry_bfr bfr, Xow_wiki wiki, byte[] raw) {Build_to_bfr(bfr, wiki, wiki.Ttl_parse(raw), Bool_.N);} + public void Build_to_bfr(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl) {Build_to_bfr(bfr, wiki, ttl, Bool_.N);} + public void Build_to_bfr(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl, boolean force_site) { byte[] page = ttl.Full_txt_raw(); Xow_xwiki_itm xwiki = ttl.Wik_itm(); if (xwiki == null) // not an xwiki; EX: [[wikt:Word]] @@ -97,7 +97,7 @@ public class Xoh_href_parser { else {} // anchor: noop } else { // xwiki - if (wiki.Appe().Xwiki_missing(xwiki.Domain_bry())) { // xwiki is not offline; use http: + if (wiki.App().Xwiki_mgr__missing(xwiki.Domain_bry())) { // xwiki is not offline; use http: bfr.Add(Href_http_bry); // add "http://"; EX: http:// bfr.Add(xwiki.Domain_bry()); // add xwiki; EX: en_dict bfr.Add(Href_wiki_bry); // add "/wiki/"; EX: /wiki/ @@ -114,9 +114,9 @@ public class Xoh_href_parser { int anch_bgn = Bry_finder.Find_fwd(ttl_full, Byte_ascii.Hash); // NOTE: cannot use Anch_bgn b/c Anch_bgn has bug with whitespace if (anch_bgn == Bry_.NotFound) // no anchor; just add page encoder.Encode(bfr_encoder, ttl_full, page_bgn, ttl_full.length); - else { // anchor exists; check if anchor is preceded by ws; EX: [[A #b]] -> "/wiki/A#b" + else { // anchor exists; check if anchor is preceded by ws; EX: [[A #b]] -> "/wiki/A#b" int page_end = Bry_finder.Find_bwd_last_ws(ttl_full, anch_bgn); // first 1st ws before #; handles multiple ws - page_end = page_end == Bry_.NotFound ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos + page_end = page_end == Bry_.NotFound ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos encoder.Encode(bfr_encoder, ttl_full, page_bgn, page_end); // add page encoder.Encode(bfr_encoder, ttl_full, anch_bgn, ttl_full.length); // add anchor } @@ -130,9 +130,9 @@ public class Xoh_href_parser { private static final byte[][] Seg__ary = new byte[][] {Seg_null_bry, Seg_wiki_bry, Seg_site_bry, Seg_xcmd_bry}; private static void Parse_wiki(Xoh_href rv, Url_encoder encoder, Xowe_wiki wiki, byte[] raw, int bgn, int len) { byte[] ttl_raw = Bry_.Mid(raw, bgn, len); - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_raw); + Xoa_ttl ttl = wiki.Ttl_parse(ttl_raw); if (ttl == null) { - wiki.Appe().Usr_dlg().Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_utf8_(raw, bgn, len)); + Xoa_app_.Usr_dlg().Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_utf8_(raw, bgn, len)); return; } if (ttl.Wik_itm() == null) { // standard href; EX: "/wiki/A" @@ -174,12 +174,12 @@ public class Xoh_href_parser { // rv.Qarg_(qarg_bry); // page_bry = Bry_.Mid(page_bry, 0, qarg_pos); // } - Parse_ttl_and_resolve_xwiki(wiki.Appe().Usr_dlg(), rv, wiki, encoder, page_bry, raw, bgn, len); + Parse_ttl_and_resolve_xwiki(rv, wiki, encoder, page_bry, raw, bgn, len); } - private static void Parse_ttl_and_resolve_xwiki(Gfo_usr_dlg usr_dlg, Xoh_href rv, Xowe_wiki wiki, Url_encoder encoder, byte[] page_bry, byte[] raw, int bgn, int len) { - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page_bry); + private static void Parse_ttl_and_resolve_xwiki(Xoh_href rv, Xowe_wiki wiki, Url_encoder encoder, byte[] page_bry, byte[] raw, int bgn, int len) { + Xoa_ttl ttl = wiki.Ttl_parse(page_bry); if (ttl == null) { - usr_dlg.Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_utf8_(raw, bgn, len)); + Xoa_app_.Usr_dlg().Warn_many("xowa.href.parser", "invalid_wiki", "wiki href does not have valid title: ~{0}", String_.new_utf8_(raw, bgn, len)); rv.Page_(Bry_.Empty); return; } @@ -198,7 +198,7 @@ public class Xoh_href_parser { } private static void Parse_xcmd(Xoh_href rv, Url_encoder encoder, Xowe_wiki wiki, byte[] raw, int bgn, int len) { // /xcmd/; note encoder is passed, but don't decode for now; most invk commands have an _ which will get changed to a " "; rv.Tid_(Xoh_href.Tid_xcmd); - rv.Wiki_(wiki.Domain_bry()); // wiki is always the current wiki + rv.Wiki_(wiki.Domain_bry()); // wiki is always the current wiki rv.Page_(Bry_.Mid(raw, bgn, len)); // page is everything after "/xcmd/"; individual cmds will do further parsing; note that it should be decoded; EX: %20 -> " "; also note that anchor (#) or query params (?) are not parsed; the entire String will be reparsed later } private static final byte Protocol_xowa_tid = Xoo_protocol_itm.Tid_xowa; diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index f5cc044c2..3d493001e 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ