mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
v2.4.2.1
This commit is contained in:
parent
18dcd3f89e
commit
551120b906
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {}
|
||||
}
|
||||
|
31
100_core/src_110_primitive/gplx/Bry_fmtr_vals.java
Normal file
31
100_core/src_110_primitive/gplx/Bry_fmtr_vals.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);}
|
||||
}
|
@ -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) {
|
||||
|
@ -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);}}
|
||||
|
@ -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();}
|
||||
|
@ -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;
|
||||
|
@ -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);}
|
||||
|
@ -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));}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();}
|
||||
}
|
||||
|
@ -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) {}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
|
@ -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);}
|
||||
|
@ -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_"
|
||||
;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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)));}
|
||||
|
@ -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) {
|
||||
|
@ -17,14 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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() {}
|
||||
|
85
400_xowa/src/gplx/core/xmls/Gfo_xml_wtr.java
Normal file
85
400_xowa/src/gplx/core/xmls/Gfo_xml_wtr.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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: </node>
|
||||
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_nde_inline = Bry_.new_ascii_("/>")
|
||||
, Bry_quote_1_escape = Bry_.new_ascii_("'")
|
||||
, Bry_quote_2_escape = Bry_.new_ascii_(""")
|
||||
;
|
||||
}
|
@ -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, "<attach_db>", diff_db ? attach_name + "." : ""); // replace <attach> with either "attach_db." or "";
|
||||
return conn.Exec_sql_as_rdr2(sql);
|
||||
}
|
||||
public void Rls() {
|
||||
|
@ -18,42 +18,50 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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);
|
||||
}
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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();
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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");}
|
||||
|
@ -155,6 +155,8 @@ net {
|
||||
}
|
||||
usr {
|
||||
}
|
||||
special {
|
||||
}
|
||||
xtns {
|
||||
}
|
||||
bldr {
|
||||
|
@ -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"
|
||||
;
|
||||
}
|
||||
|
31
400_xowa/src/gplx/xowa/apis/xowa/Xoapi_special.java
Normal file
31
400_xowa/src/gplx/xowa/apis/xowa/Xoapi_special.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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";
|
||||
}
|
34
400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java
Normal file
34
400_xowa/src/gplx/xowa/apis/xowa/specials/Xoapi_search.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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_"
|
||||
;
|
||||
}
|
@ -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) {
|
||||
|
@ -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"
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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;");
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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");
|
||||
}
|
||||
|
150
400_xowa/src/gplx/xowa/bldrs/xmls/Xob_export_wkr.java
Normal file
150
400_xowa/src/gplx/xowa/bldrs/xmls/Xob_export_wkr.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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: <a href="/wiki/Page" id="xowa_lnki_1" title="Page">Page</a>
|
||||
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); // '<a href="'
|
||||
// app.Href_parser().Build_to_bfr(bfr, wiki, lnki_ttl, hctx.Mode_is_popup()); // '/wiki/A'
|
||||
// if (cfg.Lnki_id()) {
|
||||
// int lnki_html_id = lnki.Html_id();
|
||||
// if (lnki_html_id > Lnki_id_ignore) // html_id=0 for skipped lnkis; EX:anchors and interwiki
|
||||
// bfr .Add(Xoh_consts.A_mid_id) // '" id=\"xowa_lnki_'
|
||||
// .Add_int_variable(lnki_html_id); // '1234'
|
||||
// }
|
||||
// if (cfg.Lnki_title()) {
|
||||
// bfr .Add(Xoh_consts.A_bgn_lnki_0); // '" title=\"'
|
||||
// byte[] lnki_title_bry = lnki_ttl.Page_txt(); // 'Abcd' NOTE: use Page_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> 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); // </a>
|
||||
// }
|
||||
// }
|
||||
}
|
||||
/*
|
||||
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
|
||||
<siteinfo>
|
||||
<sitename>Wikipedia</sitename>
|
||||
<dbname>simplewiki</dbname>
|
||||
<super>http://simple.wikipedia.org/wiki/Main_Page</super>
|
||||
<generator>MediaWiki 1.25wmf20</generator>
|
||||
<case>first-letter</case>
|
||||
<namespaces>
|
||||
<namespace key="-2" case="first-letter">Media</namespace>
|
||||
<namespace key="-1" case="first-letter">Special</namespace>
|
||||
<namespace key="0" case="first-letter" />
|
||||
<namespace key="1" case="first-letter">Talk</namespace>
|
||||
<namespace key="2" case="first-letter">User</namespace>
|
||||
<namespace key="3" case="first-letter">User talk</namespace>
|
||||
<namespace key="4" case="first-letter">Wikipedia</namespace>
|
||||
<namespace key="5" case="first-letter">Wikipedia talk</namespace>
|
||||
<namespace key="6" case="first-letter">File</namespace>
|
||||
<namespace key="7" case="first-letter">File talk</namespace>
|
||||
<namespace key="8" case="first-letter">MediaWiki</namespace>
|
||||
<namespace key="9" case="first-letter">MediaWiki talk</namespace>
|
||||
<namespace key="10" case="first-letter">Template</namespace>
|
||||
<namespace key="11" case="first-letter">Template talk</namespace>
|
||||
<namespace key="12" case="first-letter">Help</namespace>
|
||||
<namespace key="13" case="first-letter">Help talk</namespace>
|
||||
<namespace key="14" case="first-letter">Category</namespace>
|
||||
<namespace key="15" case="first-letter">Category talk</namespace>
|
||||
<namespace key="828" case="first-letter">Module</namespace>
|
||||
<namespace key="829" case="first-letter">Module talk</namespace>
|
||||
</namespaces>
|
||||
</siteinfo>
|
||||
<page>
|
||||
<title>April</title>
|
||||
<ns>0</ns>
|
||||
<id>1</id>
|
||||
<revision>
|
||||
<id>4926273</id>
|
||||
<parentid>4784983</parentid>
|
||||
<timestamp>2014-10-30T22:07:53Z</timestamp>
|
||||
<contributor>
|
||||
<username>AJona1992</username>
|
||||
<id>104337</id>
|
||||
</contributor>
|
||||
<comment>Events in April +Selena Day in Texas</comment>
|
||||
<model>wikitext</model>
|
||||
<format>text/x-wiki</format>
|
||||
<text xml:space="preserve">{{monththisyear|4}}
|
||||
{{Months}}</text>
|
||||
<sha1>5dbo5ljegrwg7jdt0z5myizoeryhwft</sha1>
|
||||
</revision>
|
||||
</page>
|
||||
*/
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -17,11 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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) {}
|
||||
}
|
||||
|
32
400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java
Normal file
32
400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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";
|
||||
}
|
@ -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());
|
||||
|
@ -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
|
||||
|
21
400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java
Normal file
21
400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_lnr.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);
|
||||
}
|
33
400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java
Normal file
33
400_xowa/src/gplx/xowa/gui/views/Xog_tab_close_mgr.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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 <attach_db>html h ON p.page_id = h.page_id"
|
||||
);
|
||||
|
@ -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) {
|
||||
|
@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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 href='/wiki/").Add(Html_utl.Escape_html_as_bry(ttl_full)).Add_str("' title='");
|
||||
bfr.Add_str_ascii("<a href='");
|
||||
if (site_bry != null) {
|
||||
bfr.Add_str_ascii("/site/");
|
||||
bfr.Add(site_bry);
|
||||
}
|
||||
bfr.Add_str_ascii("/wiki/");
|
||||
bfr.Add(Html_utl.Escape_html_as_bry(ttl_full)).Add_str("' title='");
|
||||
int rv = ttl_end + 1;
|
||||
if (tid == Xow_hzip_dict.Tid_lnki_text_n) {
|
||||
if (ns.Id() != 0) ttl_bry = ttl_full;
|
||||
@ -167,14 +196,17 @@ public class Xow_hzip_itm__anchor {
|
||||
);
|
||||
}
|
||||
private static final byte[]
|
||||
Find_href_wiki_bry = Bry_.new_ascii_("href=\"/wiki/")
|
||||
, Find_href_bry = Bry_.new_ascii_("href=\"")
|
||||
Find_href_bry = Bry_.new_ascii_("href=\"")
|
||||
, Find_a_rhs_bgn_bry = Bry_.new_ascii_("</a>")
|
||||
, Find_img_xatrs = Bry_.new_ascii_("xatrs='")
|
||||
;
|
||||
private static final byte Href_tid_wiki = 1, Href_tid_site = 2;
|
||||
private static final int Href_bry_len = 6; // "/wiki/".length
|
||||
private static final Btrie_fast_mgr btrie_href = Btrie_fast_mgr.cs_()
|
||||
.Add_str_byte("/wiki/", Href_tid_wiki)
|
||||
.Add_str_byte("/site/", Href_tid_site);
|
||||
private static final int
|
||||
Find_href_wiki_len = Find_href_wiki_bry.length
|
||||
, Find_href_len = Find_href_bry.length
|
||||
Find_href_len = Find_href_bry.length
|
||||
, Find_a_rhs_bgn_len = Find_a_rhs_bgn_bry.length
|
||||
;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import org.junit.*; import gplx.xowa.html.*;
|
||||
public class Xow_hzip_itm__anchor_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xow_hzip_mgr_fxt fxt = new Xow_hzip_mgr_fxt();
|
||||
@Test public void Srl_lnki_text_n() {
|
||||
byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry);
|
||||
byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); // 2=ns_ord for Main
|
||||
fxt.Test_save(brys, "<a xtid='a_lnki_text_n' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>");
|
||||
fxt.Test_load(brys, "<a href='/wiki/A' title='A'>A</a>");
|
||||
}
|
||||
@ -39,6 +39,11 @@ public class Xow_hzip_itm__anchor_tst {
|
||||
fxt.Test_save(brys, "<a xtid='a_lnki_text_n' href=\"/wiki/Template:A'b\" id='xowa_lnki_0' title='Template:A'b'>Template:A'b</a>");
|
||||
fxt.Test_load(brys, "<a href='/wiki/Template:A'b' title='Template:A'b'>Template:A'b</a>");
|
||||
}
|
||||
@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 xtid='a_lnki_text_n' href=\"/site/en.wiktionary.org/wiki/A\" id='xowa_lnki_0' title='A'>A</a>");
|
||||
fxt.Test_load(brys, "<a href='/site/en.wiktionary.org/wiki/A' title='A'>A</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_1<a xtid='a_lnki_text_n' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>a_2");
|
||||
@ -86,6 +91,10 @@ public class Xow_hzip_itm__anchor_tst {
|
||||
@Test public void Html_lnki_trail() {
|
||||
fxt.Test_html("[[A]]b", "<a xtid='a_lnki_text_y' href=\"/wiki/A\" xowa_redlink='1'>Ab</a>");
|
||||
}
|
||||
@Test public void Html_lnki_xwiki() {
|
||||
fxt.Init_xwiki("wikt", "en.wiktionary.org");
|
||||
fxt.Test_html("[[wikt:A]]", "<a xtid='a_lnki_text_n' href=\"/site/en.wiktionary.org/wiki/A\" xowa_redlink='0'>wikt:A</a>");
|
||||
}
|
||||
@Test public void Html_lnke_txt() {
|
||||
fxt.Test_html("http://a.org", "<a xtid='a_lnke_txt' href=\"http://a.org\" class=\"external text\" rel=\"nofollow\">http://a.org</a>");
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
@ -18,12 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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) {
|
||||
|
30
400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java
Normal file
30
400_xowa/src/gplx/xowa/html/wtrs/Xoh_lnki_wtr_utl.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
29
400_xowa/src/gplx/xowa/pages/Xopg_tab_data.java
Normal file
29
400_xowa/src/gplx/xowa/pages/Xopg_tab_data.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
@ -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));}
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -17,5 +17,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
@ -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;}
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -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
|
||||
|
@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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));
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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)
|
||||
;
|
||||
}
|
||||
}
|
@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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;}
|
||||
|
@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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();
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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)
|
||||
;
|
||||
}
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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'''<br/>"
|
||||
, "{|"
|
||||
, "|-"
|
||||
, "| [[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'''<br/>"
|
||||
// , "{|"
|
||||
// , "|-"
|
||||
// , "| [[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;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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}<br/>"
|
||||
, "{|"
|
||||
, "|-"
|
||||
, "| [[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_";
|
||||
}
|
@ -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);
|
||||
|
@ -17,5 +17,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
@ -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;}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
}
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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 <attach_db>page cp ON cp.{1} = sp.page_id "
|
||||
, "WHERE sp.{2} = {3}"
|
||||
, "ORDER BY {4} {5}"
|
||||
, "LIMIT {6}"
|
||||
, "OFFSET {7};"
|
||||
);
|
||||
}
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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
|
||||
;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user